在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);
}
}

ModelState 错误信息输出的更多相关文章

  1. Linux bash 中,如何将正常信息和错误信息输出到文件

    问题描述: $ command 2>> error $ command 1>> output 是否有方法,在bash同一行,实现输出stderr到error文件,输出stdou ...

  2. .net 4.5 webform 提取ModelState错误信息

    .net4.5以后,webform也可以使用模型绑定和模型验证. user实体: public class User { [Required] [Display(Name = "用户ID&q ...

  3. java日志及异常错误信息输出的问题

    1.异常信息可以层层传递,直到最后一层再输出日志也来得及 2.错误信息要在发生错误的当时就输出日志,否则到了其它层,很难得到准确的错误信息内容

  4. Abp中打开错误信息输出

    Abp默认是不向客户端输出错误日志的,导致有些内部报错既不能中断,也没有信息输出.此时打开日志输出开关即可.在xxModule类中PreInitialize()方法里 Configuration.Mo ...

  5. IIS配置错误信息输出

    Asp.net: 一.通过 IIS 配置 1.打开IIS管理器,或按住 WIN + R 打开命令行输入 inetmgr 打开 IIS 管理 2.左边目录选择目标站点,在右边 IIS 块中双击 “错误页 ...

  6. 【转】【整理】将Linux脚本中的正常输出,警告,错误等信息输出到文件中

     本文来自:http://blog.csdn.net/woshinia/article/details/18040063   很早以前  编译的时候 就在用 2>&1,但是一直没有生成一 ...

  7. 将Linux下编译的warning警告信息输出到文件中[整理笔记]

    Linux中,脚本语言环境中,即你用make xxx即其他一些普通linux命令,比如ls,find等,不同的数字,代表不同的含义: 数字 含义 标准叫法0 标准输入  stdin = standar ...

  8. PHP中的错误信息

    PHP中的错误信息   php.ini中配置错误消息 在PHP4中,没有异常 Exception这个概念,只有 错误Error.我们可以通过修改php.ini 文件来配置用户端输出的错误信息. 在ph ...

  9. 遍历ModelState中存储的错误信息

    在服务器端验证中,有时我们添加了一个ModelError,然后还需要将该信息以JS的形式返回到客户端.如: [HttpPost] public ActionResult Index(LogOnMode ...

随机推荐

  1. apache启动失败

    1.端口被占用 2.路径及文件夹问题(安装路径的文件夹名称中不能为中文)

  2. 返回上一页 html A标记代码

    <a class="sjad" href="#" onClick="javascript:history.back(-1);"> ...

  3. 【此处有干货~】jmeter+ant+jenkins持续集成配置及过程中问题解决思路

    本人是一枚工作近三年的小测试,大学正好专业为软件测试,在工作中用到最多的是功能测试.接口测试.压力测试.偶尔会涉及到性能测试......(小白,很多观念技术跟大佬差距太大,勿喷) 在接口测试过程当中, ...

  4. Windows 10 专业版 长期服务版 激活

    这个用小白系统之后一段时间显示要求激活,或者更改产品秘钥.网上找了许多秘钥也是没啥用,又不想用激活工具的话,可以试试用win+R 输入cmd : 依次输入:slmgr /skms kms.digibo ...

  5. 防止用户重发发生ajax请求

    1.前端限制 点击提交后,将该元素禁用,等待请求结束后再次释放(解除禁用). 可以使用ajax中的 success 请求成功后的回调函数进行按钮释放. 2.防抖动 暴力连续点击按钮,可以通过闭包里的  ...

  6. promise 链式

    let send = (item) => Promise.resolve(`此时参数是:(${item})`) async function init(){ const arr = [1,2,3 ...

  7. 利用canvas实现刮刮乐效果

    最近做了个情人节表白的项目,表白内容时被遮盖的,刮开后才能显示,并且刮开一定比例后清空所有遮罩. function guaguale(obj,w,h){//obj时canvas元素 var canva ...

  8. Linux学习---内存分布基础

    内核空间 应用程序不允许访问 -----------------------------------------3G 栈空间 局部变量 RW ----------------------------- ...

  9. vue中引入vux

    1.安装相关依赖 cnpm install vux --save cnpm install vux-loader --save-dev cnpm install less less-loader -- ...

  10. intent和手势探测

    一.三种启动方法 setComponent ComponentName comp = new ComponentName( this, SecondActivity.class); Intent in ...