源码解析

模型验证几乎在大部分的项目中都在被使用,这方面的博文教程也很多,关于那些更详细的模型验证这里就不多赘述了,主要讲解内部是如何进行验证的。

在前几篇博文中提到了DefaultModelBinder参数的获取及绑定就是在这个时候完成的

在绑定复杂类型(模型) 的时候,会调用OnModelUpdated方法,这个方法就是对模型的参数进行验证的

可以看到,这里先是拿到所有的验证,然后循环去验证,如果验证不通过则把错误消息添加到ModelState的Errors中。如果还有点迷糊的话,去想一下,我们在做自定义验证的时候需要去继承ValidationAttribute,然后重写Validate方法,而Mvc给我们预定义的也是继承ValidationAttribute方法重写Validate方法,这里其实就是拿到属性的Attribute然后循环调用Validate方法。

protected virtual void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Dictionary<string, bool> dictionary = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
foreach (ModelValidationResult result in ModelValidator.GetModelValidator(bindingContext.ModelMetadata, controllerContext).Validate(null))
{
string key = CreateSubPropertyName(bindingContext.ModelName, result.MemberName);
if (!dictionary.ContainsKey(key))
{
dictionary[key] = bindingContext.ModelState.IsValidField(key);
}
if (dictionary[key])
{
bindingContext.ModelState.AddModelError(key, result.Message);
}
}
}

Bind介绍

除了模型绑定,还有一个BindAttribute。它有Exclude、Include与Prefix。可以让我们选择性的接收或忽略哪些属性,最后的Prefix不提也罢,因为用到的场景很少。

public ActionResult Haha([Bind(Exclude = "Name,Age")] Person per)
{
return null;
}

Exclude可以让我们忽略某些属性,这个请求我传了Name、 Age和Id,但是在后台我限制了忽略Name和Age这样我拿到的只有Id了。

怎么做到的呢,其实很简单,在绑定Properties的时候会执行ShouldUpdateProperty方法,后面有一个Filter参数其实是一个委托

propertyFilter就是GetpropertyFilter方法,这就可以看到执行了BindAttribute的 IspropertyAllowed方法,判断了是在属性是在include还是在Exclude里面,再决定是否绑定到模型上

MVC5-10 从模型验证来说内部那些事的更多相关文章

  1. 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)

    10折交叉验证 我们构建一个分类器,输入为运动员的身高.体重,输出为其从事的体育项目-体操.田径或篮球. 一旦构建了分类器,我们就可能有兴趣回答类似下述的问题: . 该分类器的精确率怎么样? . 该分 ...

  2. [Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则

    目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...

  3. ASP.NET MVC轻教程 Step By Step 10——模型验证

    在使用表单获取用户输入的数据时,我们必须对数据进行有效性验证,因为来自网络的信息都是不可信的.同时也要给用户即时的反馈,避免让用户感到困惑.这就涉及到数据验证的范畴. 数据验证最直接的做法是在服务器端 ...

  4. 3分钟搞明白信用评分卡模型&模型验证

    信用评分卡模型在国外是一种成熟的预测方法,尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用,其原理是将模型变量WOE编码方式离散化之后运用logistic回归模型进行的一种二分类变量的广 ...

  5. Asp.net MVC]Asp.net MVC5系列——在模型中添加

    目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...

  6. webapi - 模型验证

    本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬 ...

  7. ASP.NET没有魔法——ASP.NET MVC 模型验证

    在前面的文章中介绍了用户的注册及登录功能,在注册用户时可以通过代码的形式限制用户名及密码的格式,如果不符合要求那么就无法完成操作,如下图: 该功能的原理是Identity基于的Entity Frame ...

  8. ASP.NET MVC 4 (十) 模型验证

    模型验证是在模型绑定时检查从HTTP请求接收的数据是否合规以保证数据的有效性,在收到无效数据时给出提示帮助用户纠正错误的数据. 显式模型验证 验证数据最直接的方式就是在action方法中对接收的数据验 ...

  9. ASP.NET MVC学习之模型验证详解

    ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...

随机推荐

  1. rpc框架之 thrift 学习 1 - 安装 及 hello world

    thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...

  2. 架设ftp反向代理服务器

    因网络环境限制,需要从内网(不能直接连通外网)向外部的ftp上传.下载文件,只能在网关服务器上架设ftp反向代理(网关服务器可同时连通外网与内网,但是不允许内部应用部署在这台机器上). 试了几个方案: ...

  3. MyBatis拦截器原理探究

    MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允 ...

  4. opencv1-安装及资料

    本科用过opencv2..3.1版本,当时按照 http://wiki.opencv.org.cn/index.php/首页 上面的步骤安装的,而且使用的是IplImage和CvMat等C接口的的AP ...

  5. Nodejs进阶:如何玩转子进程(child_process)

    本文摘录自个人总结<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 在node中,child_process这个模 ...

  6. [BZOJ1188][HNOI2007]分裂游戏(博弈论)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1188 分析: 设SG[i]表示一个石子在位置i上的SG值 这个很容易暴力求,因为i的后 ...

  7. JavaScript学习笔记- 正则表达式常用字符集及方法

    正则表达式修饰符(修饰符 可以在全局搜索中不区分大小写) i(ignoreCase)执行对大小写不敏感的匹配 g (global)     执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) m( ...

  8. 【JavaEE企业应用实战学习记录】MyGetAttributeListener

    package sanglp.servlet; import javax.servlet.ServletContext; import javax.servlet.ServletContextAttr ...

  9. json注意:

    import json #dct="{'1':111}"#json 不认单引号 #dct=str({"1":111})#报错,因为生成的数据还是单引号:{'on ...

  10. Apache启动提示 httpd: apr_sockaddr_info_get() failed for xxx

    httpd: apr_sockaddr_info_get() failed for xxx httpd: Could not reliably determine the server's fully ...