zoukankan      html  css  js  c++  java
  • MVC中数据验证

    http://www.studyofnet.com/news/339.html

    http://www.cnblogs.com/kissdodog/archive/2013/05/04/3060278.html

    本文导读:ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完成的。 我们要做的只是给Model类的各属性加上对应的验证标记(Attributes)就可以让MVC3框架帮我们完成验证。下面介绍MVC中数据验证的相关知识

    一、客户端验证

    客户端验证主要是为了提高用户体验,在网页不回刷的情况下完成验证。

    1、第一步是要在web.config里启用客户端验证,这在MVC3自带的模板项目中已经有了

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

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

    2、然后在被验证的View页面上要加入这样两个JavaScript,注意,他们是依赖于JQuery的

     

    <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>

    3、验证消息的显示有两种,一种是ValidationSummary,它可以显示一份验证消息的汇总,包括从后台Action里返回的消息

     @Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")
     

    另一种是Model中各属性对应HTML控件的验证消息

     @Html.ValidationMessageFor(m => m.UserName)
     
     
     
     
    二、Model中加入 验证标记 进行验证
     
     
    1、基础特性
     

     
    (1)、Required
     
    必填选项,当提交的表单缺少该值就引发验证错误。


     
    (2)、StringLength
     
    指定允许的长度
     
    指定最大长度:
     
    [StringLength(20)]  //最大长度不超过20个字符


    指定最短于最长限制:
     
     [StringLength(20,MinimumLength=3)]  //最大长度不超过20个字符,最短不能低于3个字符

    (3)、RegularExpression
     
    正则表达式能够匹配的字符串,如果不能匹配,则报一个验证错误
     
    [RegularExpression(@"[A-Za-z0-9.%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}")]


      

    (4)、Range
     

    Range特性用来指定数值类型值的最小值和最大值。
     
    [Range(35,44)]    //整型,最小35,最大44
    [Range(typeof(decimal),"0.00","49.99")]    //decimal类型


     

    (5)、Remote
     
    允许利用服务器端的回调函数执行客户端的验证逻辑。说白了就是支持AJAX验证。
     
    这个写个异步验证用户名是否存在的DEMO:            

     
    C# 代码   复制
            [Required]
    
            [Remote("CheckUserName", "Home")]
    
            public string UserName
    
            {
                get;
                set;
            }
    

    Controller代码

     
    C# 代码   复制
            public JsonResult CheckUserName(string UserName)
    
            {
                bool result = true;
                if (UserName == "admin")
                {
                    result = false;
                }
                return Json(result,JsonRequestBehavior.AllowGet);
            }
    

    显示结果

    (6)、Compare


     
    用于确保模板对象的两个对象拥有相同的值。
     
    例如,通常输入密码之后还要求用户再次确认密码,这时候就是Compare属性发挥作用的时候了。
     
    [Compare("要对比的属性名")]


    2、自定义错误提示消息


     
    每个特性都允许传递一个带有自定义错误提示消息的参数。
     

     
    C# 代码   复制
            [Required(ErrorMessage="用户名必须填写")]
    
            [Remote("CheckUserName", "Home",ErrorMessage="此用户名已存在")]
    
            public string UserName
    
            {
                get;
                set;
            }
    

    自定义错误消息,还有一个格式项,如
     
     

    C# 代码   复制
    [Required(ErrorMessage="{0}必须填写")]
    
    publit string Name
    
    {
      get;
      set;   
    }
    

    则{0}在输入的时候会被Name替换
     
    如果以上的验证方式还不够,你还可以自定义验证
     

    3、显示和编辑注解


     
    (1)、Display
     
    如果使用的是直接EditorForModel实现的话,Display特性可以帮助你设置友好的显示名称
     
    例如:
     
    [Display(Name="密码")]
    public string PassWord { get; set; }

    (2)、ScaffoldColumn
     
    隐藏Html辅助方法(如EditorForModel,DisplayForModel)显示一些属性。
     
    [ScaffoldColumn(false)]        //不显示该属性的编辑框
    public string UserName { get; set; }


    虽然ScaffoldColumn可以做到不显示一些属性在页面上被编辑,但是如果提交的Form有这个属性值,模型绑定机制依然会绑定此属性值。要解除就要显式的[Bind]了,这个与本篇无关。此处不提。
     


    (3)、DisplayFormat
     
    DisplayFormat特性可以用来处理属性的各种格式化选项。当属性包含空值时,可以提供可选的显示文本,也可以为包含标记的属性关闭HTML编码,还可以为运行时指定一个应用于属性值的格式化字符串。
     
    例如:
     
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
    public decimal money { get; set; }


    这样,当有初始值的时候,显示的代码将所示:

    注意是初始值,如果是直接填写的并不会有符号。来看Controller中设置的初始值:

     
    C# 代码   复制
            public ActionResult PersonAdd()
    
            {
                Person_Model p = new Person_Model();
                p.money = 12.10M;
                return View(p);
            }
    

    此显示样式在提交回Controller中是没用的,因为模型绑定器将不能解析返回的价格值。怎么用自己斟酌,用于显示还是OK的。


     
    (4)、ReadOnly
     
    如果确保默认的模型绑定器不使用请求中的新值更新属性,可以给属性添加ReadOnly特性:
     
    [ReadOnly(true)]
    public string Name { get; set; }


    注意,此属性仍然会显示一个可编辑的文本框来显示Name,但是模型绑定器不会接收其值,因此只有模型绑定器考虑ReadOnly属性。
     


    (5)、DataType
     
    DataType特性可以为运行时提供关于属性的特定用途的信息。
     
    例如:
     
    [DataType(DataType.Password)]
    public string PassWord { get; set; }

    该属性可以用于指定多选按钮,单选按钮,密码输入框,等等类型的数据。
     
      

    (6)、UIHint
     
    UIHint特性给Asp.net MVC运行时提供了一个模板名字,以备调用模板辅助方法如(DisplayFor和EditorFor)渲染输出时使用。也可以自定义自己的模板辅助方法来重写Asp.net MVC的默认行为。


     
    (7)、HiddenInput
     
    HiddentInput在名称空间System.Web.Mvc中,它可以告知运行时渲染一个type特性值为"hidden"的输入元素。说白了就是<input type="hidden" value="xxx" />
     

     三、验证示例

    1、首先新建一个MVC项目。添加如下代码,代码非常简单:一个Person_Model类
     

     
    C# 代码   复制
        public class Person_Model
    
        {
            [Required]
            public int Id { get; set; }
    
            [Required]
            public string Name { get; set; }
    
            [Required]
            public int Age { get; set; }
        }
    

    2、Controller类代码

    C# 代码   复制
        public class HomeController : Controller
    
        {
            public ActionResult PersonAdd()
            {
                return View();
            }
    
            [HttpPost]
            public ActionResult PersonAdd(Person_Model model)
            {
           //一行代码判断验证是否通过
                if (ModelState.IsValid)
                {
                    return Redirect("/Home/PersonManager");
                }
                return View();
            }
        }
    

    3、视图代码

     
    C# 代码   复制
    @model MvcApplication1.Models.Person_Model
    
    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout。cshtml";
    }
    <form action="/Home/PersonAdd" method="post">
      Id:<input type="text" name="Id" value="" />
      @Html.ValidationMessageFor(Model => Model.Id)  //之所以写在Person_Model的验证会显示到前端提示,主要是这种代码起的作用
    <br />
      姓名:<input type="text" name="Name" value="" />
      @Html.ValidationMessageFor(Model => Model.Name)
    <br />
      年龄:<input type="text" name="Age" value="" />
      @Html.ValidationMessageFor(Model => Model.Age)
    <input type="submit" value="确定" />
    </form>
    

    4、执行的效果

  • 相关阅读:
    suse12安装详解
    Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)
    菜鸟帮你跳过openstack配置过程中的坑[文末新添加福利]
    openstack中dashboard页面RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
    Multiple network matches found for name 'selfservice', use an ID to be more specific.报错
    查看 SELinux状态及关闭SELinux
    SELinux深入理解
    IP地址、子网掩码、网络号、主机号、网络地址、主机地址
    Oracle job procedure 存储过程定时任务
    POI文件导出至EXCEL,并弹出下载框
  • 原文地址:https://www.cnblogs.com/zkwarrior/p/4848180.html
Copyright © 2011-2022 走看看