2010-12-10 55 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