Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC ModelState与GET/POST方法和try catch块_C#_Asp.net Mvc_Try Catch_Modelstate - Fatal编程技术网

C# ASP.NET MVC ModelState与GET/POST方法和try catch块

C# ASP.NET MVC ModelState与GET/POST方法和try catch块,c#,asp.net-mvc,try-catch,modelstate,C#,Asp.net Mvc,Try Catch,Modelstate,我在让MVCModelState处理网站上的登录过程时遇到一些问题。我有一个典型的登录屏幕,其中包含用户名和密码字段。帐户控制器有两种方法来处理登录。第一个是一个名为“LogOn()”的Get方法,它只返回登录视图(即用户名/pw),第二个也被称为“LogOn(FormCollection值)”,但它指定了[AcceptVerbs(HttpVerbs.Post)] 因此,如果用户试图在不输入用户名和/或pw的情况下登录,post方法会进行检查,并通过ModelState.AddModelEror

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

因此,如果用户试图在不输入用户名和/或pw的情况下登录,post方法会进行检查,并通过ModelState.AddModelEror()向ModelState添加错误。这是发生的第一件事,在验证之后,如果ModelState.IsValidated()为false,那么我只返回View()

现在,这非常有效,如果其中一个为空,那么页面将返回并使用HtmlValidationMessage(keyName)显示正确的错误消息。问题是,在验证之后,我会进行实际的登录调用,以启动所提供用户名/pw的身份验证过程,该过程被包装在try/catch块中。如果在此过程中发生错误,我希望将错误添加到ModelState中,并返回View(),就像上面所做的那样。错误已成功添加到ModelState,视图正在正确地运行代码,但在此之后,不知何故调用了Get Logon()方法,该方法将覆盖所有内容,并仅显示视图,就像用户第一次访问页面一样

因此,整个代码流程与下面发布的流程类似:

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

如果您能提供任何帮助或深入了解此过程为何如此有效,我们将不胜感激,谢谢

您需要显式设置该值。用户名示例:

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

首先,为什么要使用try…catch进行登录,为什么不让loginProcess()返回bool?第二,我不确定我是否完全理解发生了什么,视图是否正确呈现并发送给客户机?客户端是否正在执行重定向?或者视图在发送到客户端之前被覆盖了吗?嘿,Rory,感谢您的快速响应!loginProcess周围出现try/catch块的原因是检测可能在整个过程中引发的不同异常,例如不正确的用户名/pw、数据库异常等。Firebug告诉我post发生正确,并返回给客户端。然后,请求登录,完成覆盖。但是,除了我的错误消息之外,帖子中的HTML响应都在那里。在我的HTML中。再次感谢你的帮助!嘿,达林,谢谢你的回复。我试着自己添加上面的行,我也试着先添加AddModelError()。因为如果您只是尝试SetModelValue(),那么ModelState.IsValid不会设置为false。但是,这并没有纠正问题,覆盖Get调用仍在发生。还有其他想法吗??
ModelState.SetModelValue(
    "username", 
    new ValueProviderResult(username, username, CultureInfo.InvariantCulture));