使用[HttpGet]属性调用Html.Action调用问题

时间:2010-12-10 20:02:27

标签: error-handling asp.net-mvc-3 infinite-loop http-get

我刚遇到一个奇怪的问题。我已经修好了,但我希望你能帮我更好地理解究竟出了什么问题。我将首先解释发生的事情。该问题涉及一个简单的MVC3 RC1应用程序。

在我的应用程序的母版页中,调用控制器上的操作来呈现登录表单:

@Html.Action("LoginForm", "Account")

AccountController类上的action方法返回包含登录表单的PartialViewResult。

public PartialViewResult LoginForm()
{
    return PartialView();
}

今天我对此动作方法进行了更改,并将其与HttpGetAttribute一起归类为:

[HttpGet]
public PartialViewResult LoginForm()
{
    return PartialView();
}

这就是造成问题的原因。然而,这些问题只存在于一个特定情况中 - 这就是令我困惑的问题。当将表单发布到控制器时,只要控制器操作返回 RedirectToRouteResult ,一切都会正常工作。如果操作刚刚返回 ViewResult (到其默认视图),我的Http404错误处理将启动并永远循环。

我已经以与此问题的第三个答案中描述的方式非常类似的方式实现了404错误处理:Requirements for 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] ERROR Infrastructure.Log4NetAuditor [System.Web.HttpException(0x80004005):执行处理程序'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'的子请求时出错。 ---&GT; System.Web.HttpException(0x80004005):子请求的执行失败。请查看InnerException以获取更多信息。 ---&GT; System.Web.HttpException(0x80004005):在控制器'Cdo.Web.Controllers.AccountController'上找不到公共操作方法'LoginForm'。

什么?当我看到这个时,我记得我将HttpGetAttribute放在这个方法上 - 所以我立即删除了它......并且订单已经恢复。我很高兴发现了 引起了什么 - 但我仍然在黑暗中为什么它发生了。如果你能帮我解释一下这个问题,我会非常感激。为什么HttpGetAttribute会在这里发挥作用?

1 个答案:

答案 0 :(得分:0)

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

[OutputCache(Duration = 1, VaryByParam = "None")]