我刚刚遇到了一个奇怪的问题。我已经修复了它,但我希望你能帮助我更好地了解实际出了什么问题。我将首先解释发生了什么。问题涉及一个简单的 MVC3 RC1 应用程序。
在我的应用程序的母版页中,调用了控制器上的操作以呈现登录表单:
@Html.Action("LoginForm", "Account")
AccountController 类的操作方法返回一个包含登录表单的 PartialViewResult。
public PartialViewResult LoginForm()
{
return PartialView();
}
今天我对这个动作方法进行了更改,并将其归因于 HttpGetAttribute,如下所示:
[HttpGet]
public PartialViewResult LoginForm()
{
return PartialView();
}
这就是造成问题的原因。然而,这些问题只存在于一种特定的场景中——这让我感到困惑。将表单发布到控制器时,只要控制器操作返回RedirectToRouteResult ,一切都会正常工作。如果操作只是返回一个ViewResult(到它的默认视图),我的 Http404 错误处理将启动并永远循环。
我以与该问题的第三个答案中描述的非常相似的方式实现了 404 错误处理:404 的要求。如果您不想阅读那篇文章,简单来说,我会覆盖我的基本控制器类上的 HandleUnknownAction 方法,并在该方法中实例化我的 ErrorController 类的实例并在其上调用 Execute,并传递给它一个 RouteData 的实例:
protected override void HandleUnknownAction(string actionName)
{
// If controller is ErrorController dont 'nest' exceptions
if (this.GetType() != typeof(ErrorController))
this.InvokeHttp404(HttpContext);
}
public ActionResult InvokeHttp404(HttpContextBase httpContext)
{
IController errorController = DependencyResolver.Current.GetService<ErrorController>();
var errorRoute = new RouteData();
errorRoute.Values.Add("controller", "Error");
errorRoute.Values.Add("action", "Http404");
errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString);
errorController.Execute(new RequestContext(httpContext, errorRoute));
return new EmptyResult();
}
ErrorController 所做的只是记录错误并返回带有友好错误消息的视图。嗯,它应该是这样工作的。但在这种情况下,错误处理将进入一个无限循环,其中 AccountController(我的表单发布到的)将一遍又一遍地调用 HandleUnknownAction。
错误日志中没有任何内容表明出了什么问题(我想我几乎记录了所有内容)——这也很奇怪。所以我认为如果从我的控制器基类中删除 HandleUnknownAction 方法,可能会显示其他内容。它是:
2010-12-10 19:11:47,956 [4] 错误 Infrastructure.Log4NetAuditor [System.Web.HttpException (0x80004005):执行处理程序“System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper”的子请求时出错。---> System.Web.HttpException (0x80004005): 子请求执行失败。请检查 InnerException 以获取更多信息。---> System.Web.HttpException (0x80004005):在控制器“Cdo.Web.Controllers.AccountController”上找不到公共操作方法“LoginForm”。
什么?当我看到这个时,我记得我已经将 HttpGetAttribute 放在了这个方法上——所以我立即删除了它......并且恢复了秩序。我很高兴发现是什么原因造成的——但我对它发生的原因一无所知。如果您能够帮助我阐明这一点,我将不胜感激。为什么 HttpGetAttribute 会在这里有所作为?