• 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、执行的效果

  • 相关阅读:
    【模式分解】无损连接&保持函数依赖
    【范式与函数依赖】3NF与BCNF的区别
    C#设置按钮三态背景图片
    C#代码设置窗体和Panel的位置大小
    C#窗体嵌套
    C#中弹出新窗口
    C#定义委托函数实现在别的窗体中操作主窗体中的SerialPort控件
    C#界面设计疑问2:panel摆放问题
    C#拖动自己的定义标题栏(panel)以及实现窗体拖动关闭和最小化
    C#界面设计疑问
  • 原文地址:https://www.cnblogs.com/yuyangbk/p/5387248.html
Copyright © 2020-2023  润新知