MVC执行的顺序

时间:2010-12-29 20:00:10

标签: asp.net-mvc-2

尝试同时学习MVC2 / .net 4.0。当你开始使用“MVC 2 Web”项目(即,为你设置帐户控制器和家庭控制器)时,我只使用通用模板VS。

所以我的问题是视图强烈再次输入模型。该模型如下所示:

[PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The password and confirmation password do not match.")]
public class RegisterModel {
    [Required]
    [DisplayName("User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [DisplayName("Email address")]
    public string Email { get; set; }

    [Required]
    [ValidatePasswordLength]
    [DataType(DataType.Password)]
    [DisplayName("Password")]
    public string Password { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [DisplayName("Confirm password")]
    public string ConfirmPassword { get; set; }

    [Required]
    [DisplayName("School")]
    public string School { get; set; }

}

然后我想我在我的网页上按“注册”,它从我的控制器执行以下操作:

  [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email);

            if (createStatus == MembershipCreateStatus.Success)
            {
                FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
            }
        }

        // If we got this far, something failed, redisplay form
        ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
        return View(model);
    }

所以有几个问题。

1)方法名称之上的[]类是先执行的(我不知道这里使用的术语)?例如,模型的属性高于[ValidatePasswordLength]。这是否意味着在提交dosnt验证的密码时,它甚至会击中控制器?我还可以将这个逻辑放在控制器中吗?

2)ModelState班来自哪里?

我有点想以流程图的方式了解MVC中所有内容的连接方式。它似乎是一个大圈子,没有起点。

1 个答案:

答案 0 :(得分:0)

属性的执行不如检查。

在模型绑定期间,将扫描视图模型的属性,模型绑定器获取这些属性的列表,然后可以更改其行为(例如,[bind]属性会影响模型绑定器是否尝试并填充给定属性)或调用类(例如验证属性)。

具体回答您的问题:

1)验证可以在两个地方发生,可以在调用操作之前,即当您的操作采用视图模型时,或者在调用TryValidateModel时在操作中显式执行。无论哪种方式调用操作,都由您来检查有效性并在操作中相应地处理响应,就像您在上面的操作中所做的那样。

2)ModelState来自ModelBinder。

了解MVC如何工作的最简单方法是下载源代码,调试并逐步执行请求。