【问题标题】:Problem with Html.Action call to action with [HttpGet] attribute带有 [HttpGet] 属性的 Html.Action 号召性用语问题
【发布时间】:2011-05-23 16:55:49
【问题描述】:

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

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

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

AccountController 类的操作方法返回一个包含登录表单的 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] 错误 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 会在这里有所作为?

【问题讨论】:

  • 很难理解上面的例子。 “然而,问题只存在于一个特定的场景中——这让我感到困惑。当将表单发布到控制器时,只要控制器操作返回 RedirectToRouteResult,一切都会正常工作。如果操作只返回 ViewResult(到它的默认视图),我的 Http404 错误处理将启动并永远循环。”哪个动作。引用了“表格”。哪种形式?将什么发布到什么控制器方法时?您是否尝试使用相同的方法发布? LoginForm 视图重新存储到哪个操作?有问题吗?

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2016-11-24
    相关资源
    最近更新 更多