zoukankan      html  css  js  c++  java
  • ASP.NET MVC3 Model验证总结(转)

    推荐:   ASP.NET MVC的Model元数据与Model模板:预定义模板

    http://www.cnblogs.com/artech/archive/2012/05/02/model-metadata-and-template-01.html

    ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完成的。 我们要做的只是给Model类的各属性加上对应的验证标记(Attributes)就可以让MVC3框架帮我们完成验证。我以MVC3项目模板自带的登录 做例子讲解Model的验证。

    一、启用客户端验证:

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

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

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

    然后在被验证的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>

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

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

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

    @Html.ValidationMessageFor(m => m.UserName)

    二、在Model中加入验证标记

    MVC3项目模板自带的登录模型类如下:

    public class LogOnModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }
     
        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }
     
        [Display(Name = "Remember me?")]
        public bool RememberMe { get; set; }
    }

    对比普通的C#类,我们发现每个属性上都多了被方括号“[]”包围的标记。其中,[Required]是验证标记的一种,而[Display]、[DataType]则是为了显示对应的HTML控件,这不在本文讨论范围之内。

    除了Required,我们还可以在Model中添加其他有用的验证标记。下面是个较完整的列表:

    Model类中可以添加的验证标记:

    1. 必填字段

      [Required]

      public string FirstName { get; set; }


      [RegularExpression(@"^1[34578][0-9]{9}$", ErrorMessage = "手机号格式不正确")]

      public string Phone{ get; set; }


            [EmailAddress]
            public string Email { get; set; }

    2. 字段长度

    至多n位:

      [StringLength(160)]

      public string FirstName { get; set; }

    要求至少n位:

      [StringLength(160, MinimumLength=3)]

      public string FirstName { get; set; }

    3. 正则验证

      [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}")]

      public string Email { get; set; }

    4. 范围

    [Range(35,44)]

    public int Age { get; set; }

    小数的情况:

    [Range(typeof(decimal), “0.00”, “49.99”)]

    public decimal Price { get; set; }

    5. 服务端参与的验证

    [Remote("CheckUserName","Account")]

    public string UserName { get; set; }

    然后在AccountController里指定一个CheckUserName方法:

    public JsonResult CheckUserName(string username)
    {
        var result = Membership.FindUsersByName(username).Count == 0;
        return Json(result, JsonRequestBehavior.AllowGet);
    }

     

    6. 比较

     

    [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}")]

    public string Email { get; set; }

    [Compare(“Email”)]

    public string EmailConfirm { get; set; }

    7. 自定义错误消息

    正则:

    [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}",ErrorMessage="Email doesn’t look like a valid email address.")]

    public string Email { get; set; }

    普通文本:

    [Required(ErrorMessage="Your last name is required")]

    [StringLength(160, ErrorMessage="Your last name is too long")]

    public string LastName { get; set; }

    占位符:

    [Required(ErrorMessage="Your {0} is required.")]

    [StringLength(160, ErrorMessage="{0} is too long.")]

    public string LastName { get; set; }

    三、后台Action的写法

    Action里要做的有两件事:判断ModelState是否合法、添加错误消息。MVC3模板自带的登录Action如下:

    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
      // ModelState.Remove("字段名"); //移除某字段的验证
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\"))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }
     
        // If we got this far, something failed, redisplay form
        return View(model);
    }

    [HttpPost]表示这个Action只能通过POST动作调用,这是为了配合View里的表单,因为FORM的ACTION是POST(当然也可以是GET),不过这不在本文的讨论范围内。

    if (ModelState.IsValid) 是重点,如果不出意外,即客户端浏览器没有关闭JavaScript,并且客户不是个黑客(黑客可能会通过一些工具模拟POST),那只要通过正常途径 POST到这个Action的Model都应该是IsValid的。当然,编程的一个重要原则是不能相信用户的输入,所以我们有必要再判断一次 ModelState.IsValid。

    ModelState.AddModelError方法是给View返回一个错误消息,最终交给@Html.ValidationSummary显示。

    站内相关

    http://www.cnblogs.com/xcsn/p/4677605.html

    http://www.cnblogs.com/xcsn/p/3435437.html

  • 相关阅读:
    UVa532 Dungeon Master 三维迷宫
    6.4.2 走迷宫
    UVA 439 Knight Moves
    UVa784 Maze Exploration
    UVa657 The die is cast
    UVa572 Oil Deposits DFS求连通块
    UVa10562 Undraw the Trees
    UVa839 Not so Mobile
    327
    UVa699 The Falling Leaves
  • 原文地址:https://www.cnblogs.com/xcsn/p/3157456.html
Copyright © 2011-2022 走看看