• ModelState 错误信息输出


      在MVC的项目中,我们通常情况下,为了方便(偷懒),会直接使用 !ModelState.IsValid 来判断实体的验证是否正确,但是这样对于用户的体验是不好的,当填写的内容比较多的时候,用户需要自己一个一个查找问题所在,然后修改。如何既能使用ModelState(偷懒),又能够让用户知道自己输入错误的信息在哪里呢? 基于这个情况,封装了两个类。

      其中一个,主要是开发人员自己使用,比如说,你们的项目是前后端分离的,那么前端调用的时候,传递的数据格式不正确,或者少传了那些内容,你直接使用ModelState的时候,输出一个错误,前端会很崩溃的,尤其是在提交字段较多的情况下(可能会被挨打,,,),所以,为了安全起见,专门封装了内部人员使用的类,输出的是字段的名称,前端可以直接查找问题所在。

     后一个,主要是输出错误信息给用户看的,注意在使用的过程中,你的实体类中字段名称,必须拥有DisplayName的特性!

    好了,下面是代码:

    第一个类

    /// <summary>
    /// 展示错误信息 调试使用
    /// </summary>
    public static class ModelStateExtensions
    {
    #region 调试使用
    public static List<ShowModelStateError> GetStateErrors(this System.Web.Mvc.ModelStateDictionary modelState)
    {
    var result = new List<ShowModelStateError>();
    //找到出错的字段以及出错信息
    var errorFieldsAndMsgs = modelState.Where(m => m.Value.Errors.Any())
    .Select(x => new { x.Key, x.Value.Errors });
    foreach (var item in errorFieldsAndMsgs)
    {
    //获取键
    var fieldKey = item.Key;
    //获取键对应的错误信息
    var fieldErrors = item.Errors
    .Select(e => new ShowModelStateError(fieldKey, e.ErrorMessage));
    result.AddRange(fieldErrors);
    }
    return result;
    }

    /// <summary>
    /// 输出字符串类型的错误信息
    /// </summary>
    /// <param name="modelState"></param>
    public static string GetStringStateErrors(this System.Web.Mvc.ModelStateDictionary modelState)
    {
    var errors = modelState.GetStateErrors();
    return string.Join(";", errors.Select(n => $"{n.Key}:{n.Message};").ToList());
    }

    #endregion

    }

    第二个类

    /// <summary>
    /// 展示错误信息 用户查看
    /// 注意:使用此方法需要配合实体的DisplayName使用!
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public static class ModelStateExtensionsForUser<T>
    {
    /// <summary>
    /// 存储字段描述值 key为字段名,value为DisplayName
    /// </summary>
    private static Dictionary<string, string> _DisplayNameDic;

    /// <summary>
    /// 输出字符串类型的错误信息
    /// </summary>
    /// <param name="modelState">错误信息实体</param>
    public static string GetErrors(System.Web.Mvc.ModelStateDictionary modelState)
    {
    if (_DisplayNameDic == null)
    {
    var properties = typeof(T).GetProperties();
    foreach (var item in properties)
    {
    _DisplayNameDic.Add(item.Name, item.GetCustomAttribute<DisplayNameAttribute>()?.DisplayName);
    }
    }
    var errors = modelState.GetStateErrors();
    var result = new List<string>();
    if (errors != null)
    {
    foreach (var error in errors)
    {
    if (_DisplayNameDic.ContainsKey(error.Key) && !string.IsNullOrEmpty(_DisplayNameDic[error.Key]))
    {
    result.Add($"{_DisplayNameDic[error.Key]}:数据不正确");
    }
    else
    {
    result.Add($"{error.Key}:数据不正确");
    }
    }
    }
    return string.Join(";", result);
    }
    }

  • 相关阅读:
    阿里云服务器mysql连接不了2003 -can't connect to mysql server on 'ip' (10038)
    androidstudio代码混淆
    apk反编译
    android bottomnavicationbar底部图标vector设计
    Java++:不要随意使用 Cookie 会引火烧身的
    Java++:用户认证-基于 jwt 和 session 的区别和优缺点
    Spring++:AOP 拦截 Service | Controller 日志
    Spring++:整合 Retry 实现重试机制
    (xxl_job | quartz):XXL_JOB 对比 Quartz 一决高下!
    Spring++:定时任务 Cron表达式详解
  • 原文地址:https://www.cnblogs.com/kekelele/p/9417893.html
Copyright © 2020-2023  润新知