你的位置:首页 > ASP.net教程

[ASP.net教程]第23章 模型验证


----------------------------------------------

注:1.在web.config中,对system.web元素添加<globalization culture="en-US" uiCulture="en-US">来改变区域文件设置。

      2.DataType注解属性不能用于验证用户输入,只能对使用模板辅助器进行渲染提示。

  3.实现IValidatableObject接口验证模型类,不支持客户端验证

----------------------------------------------

模型验证(Model Validation):确保用户所接收的数据适合于绑定到模型,当不合适时,给用户提供反馈信息,以帮助修改问题的过程。

    过程:

    1.检查接收的数据,保持域模型完整性的方式之一。通过拒绝域环境中无意义的数据,防止应用程序出现奇怪的情况。

    2.帮助用户修正问题,给用户提供一些需要他们遵循的、与应用程序进行交互所需要的信息和工具。

一、明确地验证模型:

  1.设置复选框样式 :

    在~/Views/Shared/EditorTemplates/Boolean.cshtml中:

@model bool?@if (ViewData.ModelMetadata.IsNullableValueType){  @Html.DropDownListFor(m => m, new SelectList(new[] {"Not Set", "True", "False"}, Model))}else{  ModelState state = ViewData.ModelState[ViewData.ModelMetadata.PropertyName];  bool value = Model ?? false;  if (state != null && state.Errors.Count > 0)  {    <div class="input-validation-error" style="float: left">      @Html.CheckBox("",value)    </div>  }  else  {    @Html.CheckBox("",value)  }}

  2.显示验证消息:

@model ModelValidation.Models.Appointment@{  ViewBag.Title = "Make A Booking";}<h2>预约</h2>@using (Html.BeginForm()){  @Html.ValidationSummary()  <p>姓名:@Html.EditorFor(m => m.ClientName)</p>    <p>预约日期:@Html.EditorFor(m => m.Date)</p>  <p>@Html.EditorFor(m => m.TermAccepted)接收协议条款    </p>   <input type="submit" value="预约"/>}

有用的ValidationSummary辅助器重载方法

重载方法描述
Html.ValidationSummary()生成所有验证错误的摘要
Html.ValidationSummary(bool)true:只显示模型级错误。默认false:显示所有错误
Html.ValidationSummary(string)在所有验证错误摘要之前加一条消息(string)
Html.ValidationSummary(bool,string)在所有验证错误摘要之前加一条消息(string)true:只显示模型级错误

  显示属性级验证消息: 

@model ModelValidation.Models.Appointment@{  ViewBag.Title = "Make A Booking";}<h2>预约</h2>@using (Html.BeginForm()){  @Html.ValidationSummary(true)  <p>姓名:@Html.EditorFor(m => m.ClientName)@Html.ValidationMessageFor(m=>m.ClientName)</p>    <p>预约日期:@Html.EditorFor(m => m.Date)@Html.ValidationMessageFor(m=>m.Date)</p>  <div>@Html.EditorFor(m => m.TermAccepted)接收协议条款    @Html.ValidationMessageFor(m=>m.TermAccepted)</div>   <input type="submit" value="预约"/>}

 二、默认模型绑定器中执行验证

DefaultModelBinder中对绑定过程添加验证的方法

方法描述默认实现
OnModelUpdated在绑定器试图对模型对象中的所有属性进行赋值时调用运用由模型元数据定义的验证规则,并用ModelState注册错误。
SetProperty在绑定器对一个特定属性运用一个值时调用

如果该属性不能保存Null值,并且没有可用值时,

将用ModelState注册一条“The <name> fieldis required”的错误消息;

如果有一值,但不能进行解析,那会将注册“The value <value> is not validfor <name>”

  1.用元数据指定验证规则:

  public class Appointment // :IValidatableObject  {    [DisplayName("客户名称")]    [Required]    public string ClientName { get; set; }    [DataType(DataType.Date)]    [DisplayName("日期")]    [Required(ErrorMessage = "请输入时间")]    public DateTime Date { get; set; }    [DisplayName("接受条款")]    [Range(typeof(bool),"true","true",ErrorMessage = "必须接受协议条款")]     public bool TermAccepted { get; set; }

内建的验证注解属性

注解属性示例描述
Compare[Compare("MyOtherProperty)]两个属性必须有同样的值。当要求用户对一个属性提供两个同样的值时,这是有用的。
Range[Range(10,20)]一个数字值(实现IComparable的属性类型),取值范围,[Range(int.MinValue,50)]
RegularExpression[RegularExpression("pattern")]一个字符串值,必须匹配的正则表达式模式。所有值,而不是子串。大小写不敏感:[RegularExpression("(?i)mypattern")]
Required[Required]非空值。空格可以接受:[Required(AllowEmptyStrings=true)]
StringLength[StringLength(10)]一个字符串值的最大长度,最小长度:[StringLength(10,MinimumLength=2)]

三、客户端验证

   启用:1.web.config中<AppSettings>

    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />

      2.引用三个JS库:

      jquery

      jquery.Validate

      jquery.validate.unobtrusive

四、远程验证:必须JosnResult类型,接收一个string参数,执行类型转换、解析或明确的模型绑定。

  1.动作方法: 

    public JsonResult ValidateDate(string date)    {      DateTime parseDate;      if (!DateTime.TryParse(date, out parseDate))      {        return Json("请输入格式为“mm/dd/yyyy”的日期", JsonRequestBehavior.AllowGet);      }      else if(DateTime.Now>parseDate)      {        return Json("请输入一个未来时间以用来预约", JsonRequestBehavior.AllowGet);      }      else      {        return Json(true, JsonRequestBehavior.AllowGet);      }    }

  2.Remote注解属性:

    [Remote("ValidateDate","Home")]     public DateTime Date { get; set; }

源码:http://yunpan.cn/ccGAZD7d5QL6Z 访问密码 672a