4

我刚刚遇到了一个奇怪的问题。我已经修复了它,但我希望你能帮助我更好地了解实际出了什么问题。我将首先解释发生了什么。问题涉及一个简单的 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 会在这里有所作为?

4

1 回答 1

0

尝试将 outputcache 属性设置为 action。我记得那种问题,这是一个解决方案。将持续时间设置为 1

[OutputCache(Duration = 1, VaryByParam = "None")]
于 2012-07-10T07:09:29.570 回答