net MVC中的模型绑定、验证以及ModelState

简介: net MVC中的模型绑定、验证以及ModelState 模型绑定 模型绑定应该很容易理解,就是传递过来的数据,创建对应的model并把数据赋予model的属性,这样model的字段就有值了。

net MVC中的模型绑定、验证以及ModelState

模型绑定

模型绑定应该很容易理解,就是传递过来的数据,创建对应的model并把数据赋予model的属性,这样model的字段就有值了。
比如要创建用户,在form表单中填写用户名密码,在controller中直接使用User类接收就行了:

public ActionResult Create(User user){
     var name=user.Name;
     var pwd=user.Pwd;
     return View();
}

需要注意的是,传递每一项数据的名称和接收的类的属性名称必须相同。

模型验证

经常使用的就是在模型类中给属性增加特性标签。如:

    public class HomeFeedbackViewModel
    {
        [Required(ErrorMessage ="尚有未填写项,请先完善")]
        public string Name { get; set; }
        [Required(ErrorMessage = "尚有未填写项,请先完善")]
        [EmailAddress(ErrorMessage ="邮箱格式错误")]
        public string Email { get; set; }
     } 

这些[Require]、[EmailAddress]之类的就是特性标签。Require就是说这个属性不能为空,EmailAddress就是说这个属性值必须符合一个Email地址格式。这些都是MVC框架封装好的。

特性都继承自Attribute,而这些特性标签都是MVC框架自带的,继承自ValidationAttribute(ValidationAttribute继承自Attribute),如果你自己也想写一个特性标签来自定义校验规则走mvc自带的校验流程,记住要继承ValidationAttribute而不是继承Attribute。

当请求action时,如果使用模型接收数据,就会自动执行模型绑定,把数据赋予和它相同名称的属性字段,然后校验属性的值是否符合属性上特性标签的校验。也可以自己调用显示绑定
如何判断当前模型是否通过了校验?
在Controller的 action中经常使用ModelState.IsValid来判断

        public ActionResult Create(Feedback.ViewModels.HomeFeedbackViewModel Mags)
        {
            if (!ModelState.IsValid)
            {
            return Content('数据校验不通过');
            }
           return View();
       }

ModelState.IsValid,模型状态是否有效,很容易理解。我以前一致纳闷ModelState从哪里来的,明明没有创建它。其实ModelState是System.Web.Mvc.Controller类下的一个成员,因为自己写的Controller都继承自System.Web.Mvc.Controller,自然拥有了该命名空间下的成员,所以可以直接使用。
ModelState是什么?
这里写图片描述
可以看出他的类型是ModelStateDictionary,翻译过来是模型状态字典,也就是很多ModelState的集合。再看下ModelStateDictionary类
这里写图片描述
里面成员很多,挑几个说。IsValid是判断模型验证是否成功的。Keys我们猜也能猜出来是所有字段的名称集合,可以通过Key来访问ModelState。注意这个ModelState是一个类了和前面的Controller下面的从成员不一样了,你可以理解为Controller下面的从成员ModelState,就是包含很多ModelState类实例的集合。来看下ModelState
这里写图片描述
Value就是当前字段的一些信息比如值、区域信息之类的。Errors就是当前所验证属性上所打的特性标签验证失败的提示信息,简单理解就是 [Required(ErrorMessage =”尚有未填写项,请先完善”)]中的ErrorMessage的集合,比如上面的HomeFeedbackViewModel类中的Email字段,当输入Email为空时,既不符合Required的非空要求,也不符合EmailAddress的格式要求,这里Errors的Count等于2。注意:验证失败的错误信息是根据字段分集合的。

实例:
我们这里有一个场景,校验失败后,返回检验失败的提示。思路就是根据Controller下ModelState这个成员,判断其属性IsValid,如果为false,遍历ModelState的Keys(类的属性的集合)取出每一个属性的ModelState,然后判断属性的ModelState的成员Errors的数量是否大于0,大于0的话说明这个属性验证不通过,返回这一条验证失败的错误信息。

           if (!ModelState.IsValid)
            {
                foreach (var key in ModelState.Keys)
                {
                    var modelstate = ModelState[key];
                    if (modelstate.Errors.Any())
                    {
                        return modelstate.Errors.FirstOrDefault().ErrorMessage;
                    }
                }
            }
原文地址http://www.bieryun.com/2536.html
相关文章
|
3天前
|
机器学习/深度学习 存储 计算机视觉
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-4
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
34 11
|
3天前
|
机器学习/深度学习 算法 数据可视化
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-3
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
12 0
|
3天前
|
算法 数据可视化
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-1
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
18 0
|
3天前
|
前端开发 Java PHP
信息系统架构模型(1) MVC
信息系统架构模型(1) MVC
10 0
|
9天前
|
算法
r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现
r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现
17 1
|
10天前
|
算法
r语言中对LASSO,Ridge岭回归和Elastic Net模型实现
r语言中对LASSO,Ridge岭回归和Elastic Net模型实现
14 0
|
16天前
|
机器学习/深度学习 数据挖掘 Go
中科院二区7.4分|NET基因肿瘤分型+生存预后模型+分子对接
在《Journal of Translational Medicine》上发表的最新研究中,科学家们鉴定了一种新的NET相关基因签名,用于预测弥漫性大B细胞淋巴瘤(DLBCL)患者的预后。他们发现8个基因(PARVB,LYZ,PPARGC1A,HIF1A,SPP1,CDH1,S100A9和CXCL2)与DLBCL生存率显著相关,建立了NRG遗传风险模型,该模型可能有助于指导DLBCL的治疗选择。研究包括基因表达数据的分析、预后特征的构建和验证,以及与免疫微环境和潜在治疗靶点的相关性探索。
17 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
设计模式 前端开发 数据处理
MVC架构中,控制器和模型之间是如何交互的
MVC架构中,控制器和模型之间是如何交互的
10 0