【问题标题】:ASP.NET MVC ModelState with GET/POST methods and try-catch blocks带有 GET/POST 方法和 try-catch 块的 ASP.NET MVC ModelState
【发布时间】:2011-01-06 20:47:27
【问题描述】:

我在让 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();
} 

任何有关此过程为何以这种方式工作的帮助或见解将不胜感激,谢谢!!

【问题讨论】:

  • 首先,你为什么使用 try...catch 登录,为什么不让 loginProcess() 返回一个布尔值?其次,我不确定我是否理解到底发生了什么,视图是否正确呈现并发送给客户端?客户端然后进行重定向吗?还是视图在发送给客户端之前以某种方式被覆盖?
  • 嗨,Rory,感谢您的快速回复! loginProcess 周围的 try/catch 块的原因是为了检测可能在整个过程中抛出的不同异常,例如不正确的用户名/密码、数据库异常等。Firebug 告诉我帖子发生正确,并返回到客户。之后,正在请求一个 GET to LogOn 来进行覆盖。但是,除了我的错误消息之外,来自 POST 的 HTML 都在那里。在 HTML 中,我有 。再次感谢您的帮助!

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


【解决方案1】:

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

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

【讨论】:

  • 嗨达林,感谢您的回复。我尝试自己添加上面的行,我也尝试了 AddModelError() 首先发生。因为如果您只是尝试 SetModelValue() 那么 ModelState.IsValid 不会设置为 false。但是,这并没有解决问题,并且覆盖 Get 调用仍在发生。还有其他想法吗??
猜你喜欢
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多