zoukankan      html  css  js  c++  java
  • 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);
    }
    }

  • 相关阅读:
    WayOs 聊天软件号码全自动登陆查询系统,支持号码复制、消息发送、号码导出
    easyradius中,如何把wayos中的数据同步到easyradiu中?
    EPON、GPON无源光网络在城中村、小区网络中的解决方案
    EasyRadius 从1.6升级到 1.65 提示:初始化连接失败,未找到可用的接口信息,解决方案
    WayOs 计费 EasyRadius宽带云计费系统隆重发布,支持一个帐号管理多个路由的
    故障处理:这几天发现的几个WAYOS故障问题的现象及分析,解决方案
    Delphi内嵌汇编语言BASM精要(转帖)
    Windows SDK编程(Delphi版) 之 消息处理
    E销助手软件
    Delphi与Python结合
  • 原文地址:https://www.cnblogs.com/kekelele/p/9417893.html
Copyright © 2011-2022 走看看