尝试同时学习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中所有内容的连接方式。它似乎是一个大圈子,没有起点。
答案 0 :(得分:0)
属性的执行不如检查。
在模型绑定期间,将扫描视图模型的属性,模型绑定器获取这些属性的列表,然后可以更改其行为(例如,[bind]属性会影响模型绑定器是否尝试并填充给定属性)或调用类(例如验证属性)。
具体回答您的问题:
1)验证可以在两个地方发生,可以在调用操作之前,即当您的操作采用视图模型时,或者在调用TryValidateModel时在操作中显式执行。无论哪种方式调用操作,都由您来检查有效性并在操作中相应地处理响应,就像您在上面的操作中所做的那样。
2)ModelState来自ModelBinder。
了解MVC如何工作的最简单方法是下载源代码,调试并逐步执行请求。