用MVC搭建班级站点----注册界面:数据注解的使用

     这学期Web程序设计的课程设计是班级站点,使用的是ASP.NET,所以我决定使用ASP.NET MVC来完成这个题目。

     先是完成了一个小小的东西--注册界面:

    

     要做到这样的页面其实非常简单,只要一个fieldset就行,关键是警告消息也就是验证这里。

     MVC为数据注解提供了很多便利,要做到上面的效果,只要在model中相关的属性字段添加数据注解就行:

 public class User
    {
        [HiddenInput(DisplayValue = false)]
        public int UserID { get; set; }

        [Required(ErrorMessage = "名字不能为空!")]
        [StringLength(160)]
        [DisplayName("姓名")]
        public String Name { get; set; }

        [Required(ErrorMessage = "密码不能为空!")]
        [StringLength(160)]
        [DisplayName("密码")]
        [DataType(DataType.Password)]
        public String Password { get; set; }

        [Required(ErrorMessage = "请重新输入密码!")]
        [StringLength(160)]
        [DisplayName("确认密码")]
        [DataType(DataType.Password)]
        [Compare("Password", ErrorMessage = "密码不一致,请重新输入!")]
        public String ConfirmPassword { get; set; }

        [Required(ErrorMessage = "电话不能为空!")]
        [StringLength(160)]
        [DisplayName("电话")]
        public String Phone { get; set; }

        [Required(ErrorMessage = "QQ不能为空!")]
        [StringLength(160)]
        [DisplayName("QQ")]
        public String QQ { get; set; }

        [Required(ErrorMessage = "邮箱不能为空!")]
        [StringLength(160)]
        [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+[A-Za-z]{2,4}", ErrorMessage = "Email is not valid")]
        [DataType(DataType.EmailAddress)]
        [DisplayName("Email")]
        public String Email { get; set; }

        [Required(ErrorMessage = "学号不能为空!")]
        [DisplayName("学号")]
        public long Number { get; set; }
    }

      具体的内容请看我的另一篇博客:http://www.cnblogs.com/wenjiang/archive/2013/04/03/2998793.html这里面讲得还是相对清楚。
      就算我们在model的属性字段上添加了数据注解,但这并不意味着就可以收工了。

      数据注解原本是提供服务器端验证的功能,但随着发展,客户端验证成为需求,于是在model上使用的数据注解也提供了客户端验证。数据注解非常好用,它使得我们从大量的验证代码中解放出来,但它到底是怎样做到的呢?验证又是什么时候发生呢?

      默认情况下,MVC框架是在模型绑定的时候执行验证逻辑。

      什么是模型绑定呢?模型绑定的产生源自于命名约定:视图上的元素名称像是input元素,大多都匹配属性名称。基于这样的事实,"约定优先于配置"就开始发挥作用了。我们在操作(Action)中传入一个模型作为参数,MVC就会调用默认的模型绑定器(不同类型的模型可以注册多个模型绑定器,但一般情况下默认的模型绑定器就已经能够解决大部分问题)。当模型绑定器看到传入的model中包含某个请求中出现的参数时,它就会将该值转换和移入到model中,它甚至可以自己创建一个model来填充!所谓的请求,就像是提交的表单集合,但是模型绑定器查找的请求并不仅限于表单集合,它使用的是名为值提供器(value provider)的组件在请求的不同区域中查找参数值。它可以查看表单集合,也可以查看路由数据和查询字符串。

      神奇的是,模型绑定器使用的模型可以是基本数据类型,像是int也可以作为它填充的参数,就像我们想要查找ID值,就可以传入一个int值,然后模型绑定器就会在查询字符串或者路由数据中找到我们想要的值。

      模型绑定的副作用就是模型状态,它记录的是模型绑定器移进模型中的每一个值以及与该属性相关联的所有错误。所以,我们可以查看模型状态以了解模型绑定是否成功。

      了解了模型绑定器后,我们就明白,当模型绑定器使用新值完成对模型属性的更新后,就会利用当前的模型元数据获得模型的所有验证器。模型验证器会找到所有的验证特性并且执行它们包含的验证逻辑,然后模型绑定器会捕获所有失败的验证规则并把它们放入模型状态中。内置的HTML辅助方法可以利用模型状态来改变模型在视图中的显示。基于这样的事实,我们上面的错误消息显示就知道是怎么显示在视图上了,像是这样:

  <%: Html.ValidationMessageFor(model => model.Name) %>

       这种方式可以让我们在视图上各属性对应的HTML控件旁边显示对应的错误消息。
       也有其他的方法,就是我们可以先得到,然后在视图某个区域集中显示所有错误消息:

 <%: Html.ValidationSummary(true) %>

       参数为true表示隐藏属性级别的错误消息,只显示模型级别的错误。为false则刚好相反:

     

      这样肯定不好看,所以只适合验证字段比较少的情况。

      接下来就是Controller:

        [HttpPost]
        public ActionResult Register(User user)
        {
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                MembershipCreateStatus createStatus;
                Membership.CreateUser(user.Name, user.Password, user.ConfirmPassword, "question", "answer", true, null, out createStatus);
                if (createStatus == MembershipCreateStatus.Success)
                {
   
                    FormsAuthentication.SetAuthCookie(user.Name, false /* createPersistentCookie */);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            return View(user);
        }

      首先我们必须检查模型绑定是否成功,这个可以通过检查ModelState是否有效来判断,而且ModelState还可以返回绑定失败的属性及其相关的错误消息。
      模型绑定成功后,就是Membership出现的机会。

      Membership用于验证用户凭证并管理用户设置,主要用于用户的身份验证。注册的时候,我们是首次添加该用户,所以我们需要在Membership中添加该用户。MembershipCreateStatus用于获取Membership创建该用户的操作结果,CreateUser()方法可以将具有指定属性值的用户存进用户存储区,并且可以指定唯一标识符,由于这里我们并不需要唯一标识符,所以设为null。当用户角色创建成功后,我们采用Forms身份验证,将用户名作为身份验证Cookie并添加到响应的Cookie集合或者URL中。要对身份验证展开讨论,会是一个非常大的话题,所以这里只是简单讲一下。

      如果模型绑定不成功,我们就要将绑定不成功的错误添加到ModelState中,这里的代码是:

ModelState.AddModelError("", ErrorCodeToString(createStatus));

      表示排除属性级别的验证,因为并没有提供关联错误与特定属性的键值。我们也可以指定某个特定的属性值,这样在视图中就不会显示与该属性有关的错误消息,因为它已经被添加进ModelState中,取而代之的是后面指定的消息。

     

posted @ 2013-05-31 19:55  文酱  阅读(1946)  评论(0编辑  收藏  举报