asp.net mvc3 基础篇之十一 model validation
model validation(模型验证)是asp.net mvc 表单和业务逻辑验证操作
首先看一下最简单验证例子
model代码
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int age { get; set; }
[DataType(DataType.Date)]
public DateTime date { get; set;}
}
view代码
@model MvcApplication2.Models.Person
@using (Html.BeginForm())
{
@Html.EditorForModel()
<input id="Submit1" type="submit" value="submit" />
}
Controller代码
[HttpGet]
public ActionResult Index()
{
Person person = new Person();
person.FirstName = "ml";
person.LastName = "dark";
person.age = 25;
person.date = DateTime.Now;
return View(person);
}
[HttpPost]
public ActionResult Index(Person person )
{
if (person.FirstName == "")
ModelState.AddModelError("firstName", "请输入姓名");
if (person.LastName == "")
ModelState.AddModelError("lastName","请输入名字");
if (person.age <1)
ModelState.AddModelError("age","请输入年龄");
if (ModelState.IsValid)
{
return View("NewPage",person);
}
else
return View();
}
验证最核心是modelState属性 只要添加一条Error信息 IsValid返回false 没有添加返回true
显示效果

关于验证错误的css样式 只要在view页面加上content/Site.css路径即可 这是vs生成的css 不是个人写的
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
验证css代码
.input-validation-error {
border: 1px solid #ff0000;
background-color: #ffeeee;
}
如果希望显示错误列表 在view页面 @Html.ValidationSummary() 即可 这个方法重载方法 参考msdn说明即可
接下来 介绍两个模型验证扩展 SetProperty和OnmodelUpdated方法
先看看setproperty方法
public class ValidationModelBinder : DefaultModelBinder
{
protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
switch (propertyDescriptor.Name)
{
case "FirstName":
if (string.IsNullOrEmpty((string) value))
bindingContext.ModelState.AddModelError("firstName", "请输入姓名");
break;
case "LastName":
if (string.IsNullOrEmpty((string)value))
bindingContext.ModelState.AddModelError("lastName", "请输入名字");
break;
//其他属性验证同样 这里不必写了
}
}
然后在Global.aspx.cs
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ModelBinders.Binders.Add(typeof( MvcApplication2.Models.Person), new MvcApplication2.Controllers.ValidationModelBinder());
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
显示效果和上面图片一样
如果Html.ValidationSummary(true) 显示列表一个总结错误信息
ModelState.AddModelError("", "显示总结一条错误信息"); 属性名为空
那么onmodelUpdated方法现实这个扩展
public class ValidationModelBinder : DefaultModelBinder
{
protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
switch (propertyDescriptor.Name)
{
case "FirstName":
if (string.IsNullOrEmpty((string) value))
bindingContext.ModelState.AddModelError("firstName", "请输入姓名");
break;
case "LastName":
if (string.IsNullOrEmpty((string)value))
bindingContext.ModelState.AddModelError("lastName", "请输入名字");
break;
//其他属性验证同样 这里不必写了
}
}
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext);
Person person = bindingContext.Model as Person;
if (string.IsNullOrEmpty( person.FirstName) || string.IsNullOrEmpty( person.LastName) || person.age < 0)
{
bindingContext.ModelState.AddModelError("", "总结错误显示");
}
}
}
显示效果

使用验证特性 (validation Attribute
{
public class Person
{
[Required]//必须填写验证
public string FirstName { get; set; }
[StringLength(10)]//字符串长度验证
public string LastName { get; set; }
[Range(18,100)]//范围验证
public int age { get; set; }
[DataType(DataType.Date)]
[RegularExpression(@"\d{4}-\d{2}-\d{2}")]//正则表验证
public DateTime date { get; set;}
}
使用自定义验证特性
public class MustBeTrueAttribute : ValidationAttribute {
public override bool IsValid(object value) {
return value is bool && (bool)value;
}
}
例子
[MustBeTrue(ErrorMessage="验证boolean")]
public bool b { get; set; }
自定义验证特性
public class FutureDateAttribute : RequiredAttribute {
public override bool IsValid(object value) {
return base.IsValid(value) &&
value is DateTime &&
((DateTime)value) > DateTime.Now;
}}
例子
[DataType(DataType.Date)]
[FutureDate(ErrorMessage="请输入正确时间")]
public DateTime Date { get; set; }
使用 IValidatableObject 现实验证错误列表
public class Person : IValidatableObject
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int age { get; set; }
[DataType(DataType.Date)]
public DateTime date { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
List<ValidationResult> valis = new List<ValidationResult>();
if (string.IsNullOrEmpty(FirstName))
valis.Add(new ValidationResult("请输入姓名;"));
if (string.IsNullOrEmpty(LastName))
valis.Add(new ValidationResult("请输入名字"));
return valis;
}
}
使用客户端验证
在客户端验证比较麻烦多 首先在web.config中确认

也可以在Global.asax.cs
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
HtmlHelper.ClientValidationEnabled = true;
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
希望那个页面不想用客户端 那在当前页面HtmlHelper.ClientValidationEnabled = false
那么model代码

view页面
@model MvcApplication2.Models.Person
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.ValidationSummary()
@Html.EditorForModel()
<input id="Submit1" type="submit" value="submit" />
}
这样可以了 在用 @Html.EditorForModel()比较方便自动生成 那么自定义代码
@model MvcApplication2.Models.Person
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.ValidationSummary()
<p>姓名; @Html.EditorFor(m=>m.FirstName) @Html.ValidationMessageFor(m =>m.FirstName) </p>
<p>名字;@Html.EditorFor(m=>m.LastName) @Html.ValidationMessageFor(m=>m.LastName)</p>
<p>年龄;@Html.EditorFor(m=>m.age)@Html.ValidationMessageFor(m=>m.age) </p>
<input id="Submit1" type="submit" value="submit" />
}


浙公网安备 33010602011771号