我在让 MVC 模型状态与网站上的登录过程一起工作时遇到了一些问题。我有一个典型的登录屏幕,其中包含用户名和密码字段。帐户控制器有 2 种方法来处理登录。第一个是名为“LogOn()”的 Get 方法,它只返回登录视图(即用户名/密码),第二个也称为“LogOn(FormCollection values)”,但它具有 [AcceptVerbs(HttpVerbs.Post )] 指定的。
因此,如果用户尝试在没有输入用户名和/或密码的情况下登录,则 post 方法会对此进行检查,并通过 ModelState.AddModelEror() 将错误添加到 ModelState。这是发生的第一件事,在验证之后,如果 ModelState.IsValidated() 为 false,那么我只返回 View()。
//(validate just adds to Modelstate when values are null)
if (!ValidateLogOn(userName, password))
return View();
现在,这很好用,如果其中一个为空白,则页面将返回并使用 HtmlValidationMessage(keyName) 显示正确的错误消息。问题是,在验证之后,我会进行实际的登录调用以启动提供的用户名/密码的身份验证过程,该用户名/密码包含在 try/catch 块中。如果在这个过程中发生错误,我想将错误添加到 ModelState,并返回 View(),就像我上面做的那样。错误已成功添加到 ModelState 中,并且 View 正在正确地运行代码,但在那之后,不知何故调用了 Get Logon() 方法,然后覆盖所有内容并只显示 View,就好像它是用户第一次访问该页面!
所以整个代码过程类似于下面发布的:
public ActionResult LogOn()
{
return View();
}
public ActionResult LogOn(FormCollection values)
{
if (!ValidateLogOn(userName, password))
return View();
try {
loginProcess(username, password);
}
catch (Exception e) {
ModelState.AddModelError(keyName, "Error Message");
return View();
}
return View();
}
任何有关此过程为何以这种方式工作的帮助或见解将不胜感激,谢谢!