zoukankan      html  css  js  c++  java
  • 第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

  • 相关阅读:
    gvim : invalid input string
    端口
    Sequence Overview
    vi的使用
    Ubuntu安装CodeBlocks相关问题总结
    中断
    Ubuntu Software Repository
    UVA 12299 RMQ with Shifts
    UVA 12293 Box Game
    POJ 3468 A Simple Problem with Integers (1)
  • 原文地址:https://www.cnblogs.com/wjs5943283/p/4674626.html
Copyright © 2011-2022 走看看