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" />
}

posted @ 2011-11-01 15:41  糯米小虾  阅读(1143)  评论(0)    收藏  举报