2010-12-10 80 views
4

我刚刚遇到一个奇怪的问题。我已经修复了这个问题,但我希望你能帮助我更好地理解实际上出了什么问题。我将从解释发生的事情开始。这个问题涉及一个简单的MVC3 RC1应用程序。Html.Action呼叫问题与[HttpGet]属性

在我的应用程序的母版页有一个控制器上的行动呼吁呈现一个登录形式:

@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会在这里有所作为?

+1

其难以遵循上述情况。 “但是,这些问题只存在于一个特定的场景中 - 这让我感到困惑,当向控制器发布表单时,只要控制器操作返回了RedirectToRouteResult就可以正常工作,如果操作返回了ViewResult(to它的默认视图),我的Http404错误处理将会启动并永远循环。“哪个行动。引用“表单”。哪种形式?什么时候发布什么控制器的方法?你是否试图发布到相同的方法? LoginForm视图保存到哪个操作?有没有可能吗? – 2011-10-03 01:29:57

回答

0

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