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

  • 相关阅读:
    Atitit nosql的艺术 attilax著作 目录 1. 1.5NoSQL数据库的类型 1 1.1. 1.5.1键值(Key/Value)存储 1 1.2. 1.5.2面向文档的数据库 1 1
    Atitit 常见信息化系统类别erp mes crm cms oa 目录 1.  企业资源规划(ERP)、客户关系管理(CRM)、协同管理系统(CMS)是企业信息化的三大代表之作 1 2. 概
    Atitit 信息管理概论 艾提拉总结 信息的采集 信息格式转换 信息整合 信息的tag标注 信息的结构化 信息检索,,索引 压缩 信息分析 汇总 第1章 信息管理的基本概念 第
    Atitit 产品化法通则 目录 1. 何谓软件产品化? 1 2. 产品化优点 vs 项目化 2 2.1. 软件复用率提高 2 2.2. ,项目化交付 2 2.3. 维护成本高 2 3. 产品金字塔
    Atitit 人工智能 统计学 机器学习的相似性 一些文摘收集 没有人工智能这门功课,人工智能的本质是统计学和数学,就是通过机器对数据的识别、计算、归纳和学习,然后做出下一步判断和决策的科学
    Atitit mybatis spring整合。读取spring、yml、文件的mysql url 步骤,读取yml,文件,使用ongl定位到url pwd usr 读取mybatis模板配置,
    关于一个大型web系统构架图的理解
    关于《王福朋petshop4.0视频教程》下载的更新
    不完全接触Node.js
    毕业设计那些事
  • 原文地址:https://www.cnblogs.com/wjs5943283/p/4674626.html
Copyright © 2011-2022 走看看