netMVC中的模型绑定、验证以及ModelState
模型绑定mvc的controller
模型绑定应该很容易理解,就是传递过来的数据,创建对应的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;
}
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。