ASP.NET MVC ModelState,带有GET / POST方法和try-catch块

时间:2010-01-19 15:32:17

标签: c# asp.net-mvc try-catch modelstate

我遇到一些问题,让MVC模型状态在网站上使用登录过程。我有一个典型的登录屏幕,其中包含用户名和密码的字段。帐户控制器有两种方法来处理登录。第一个是名为“LogOn()”的Get方法,它只返回登录视图(用户名/ pw),第二个也称为“LogOn(FormCollection values)”,但它有[AcceptVerbs(HttpVerbs.Post) )]指定。

因此,如果用户尝试登录而不输入用户名和/或pw,则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)显示正确的错误消息。问题是,在验证之后,我进行实际的登录调用以启动所提供的用户名/ pw的身份验证过程,该用户名/ pw包含在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();
} 

非常感谢任何有关此过程为何如此运作的帮助或见解,谢谢!!

1 个答案:

答案 0 :(得分:0)

您需要明确设置值。用户名示例:

ModelState.SetModelValue(
    "username", 
    new ValueProviderResult(username, username, CultureInfo.InvariantCulture));