2011-09-01 38 views
10

我使用MVC出現InvalidOperationException與自定義錯誤頁

<customErrors mode="On" defaultRedirect="~/Home/Error"> 
    <error statusCode="404" redirect="~/Home/PageNotFound" /> 
</customErrors> 

我創建了一個網頁,拋出和異常和我重定向到正確的錯誤頁自定義錯誤頁的設置。

但是我注意到在生產Web服務器中ELMAH這些錯誤:

System.InvalidOperationException視圖「錯誤」或它的主人是 沒有發現或沒有視圖引擎支持搜索到的位置。 以下地點被搜索: 〜/地區/ Football/Views/Draft/Error.aspx 〜/地區/ Football/Views/Draft/Error.ascx 〜/ Areas/Football/Views/Shared/Error.aspx 〜/地區/足球/查看/共享/ Error.ascx〜/查看/草案/ Error.aspx 〜/查看/草案/ Error.ascx〜/查看/共享/ Error.aspx 〜/查看/共享/錯誤。 ASCX〜/地區/足球/查看/草案/ Error.cshtml 〜/地區/足球/查看/草案/ Error.vbhtml 〜/地區/足球/查看/共享/ Error.cshtml 〜/地區/足球/瀏覽次數/Shared/Error.vbhtml〜/查看/草案/ Error.cshtml 〜/查看/草案/ Error.vbhtml〜/查看/共享/ Error.cshtml 〜/查看/共享/ Error.vbhtml

爲什麼找其他地方的錯誤頁面?我刪除了〜/ Views/Shared/Error.cshtml並在〜/ Home/Error中添加了我的自定義錯誤頁面,因爲我在配置文件中指定了一個新的默認值。

任何想法?

謝謝。

+0

由於'customErrors'是(不是ASP的東西ASP.NET交易.NET MVC),它不是這項工作的最佳工具。理查德丁沃爾有一個很好的職位:http://richarddingwall.name/2008/08/17/strategies-for-resource-based-404-errors-in-aspnet-mvc/ –

回答

26

MVC項目默認情況下,在Global.asax.cs文件

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

當未處理的異常時,將執行此過濾器將被HandleErrorAttribute。它將視圖設置爲Error。因此MVC運行時嘗試呈現該視圖。但就你而言,沒有這種看法。因此它再次拋出另一個由ASP.NET運行時處理的異常,並顯示您在Web.Config文件中配置的錯誤頁面。

您可以創建自己的異常過濾器並註冊它。

+0

謝謝你是對的,似乎是到底發生了什麼。我放置了默認的錯誤視圖並拋出一個異常,關於找不到默認視圖的錯誤消失了。但是,elmah不會記錄異常。我很好地使用默認視圖,但elmah如何不記錄錯誤?它記錄404很好,但不是服務器500錯誤。 –

+2

@Aros - 您需要爲Elmah實現HandleErrorAttribute的特殊版本。你可以在這裏找到一個例子:http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx –

+0

謝謝你現在我在回答中註釋掉了這一行,並且依靠從web.config重定向的自定義錯誤。如果導致問題,我會在這裏使用答案。 http://stackoverflow.com/questions/766610/how-to-get-elmah-to-work-with-asp-net-mvc-handleerror-attribute/779961#779961 任何人都知道爲什麼我不想評論那行代碼出來了? –

5

我最終在Global.asax中註冊了HandleErrorAttribute,並且只使用了<customErrors>部分。 ELMAH現在可以正確記錄錯誤,並且我可以指定自定義錯誤頁面。

我錯過了什麼嗎?

+0

似乎爲我工作,讓我有點緊張,但看不出有什麼問題。 – andrewb

+0

爲我使用StackExchange.Exceptional而不是Elmah自定義錯誤。 – Gareth

0

對於這個職位的未來的讀者,請注意ELMAH添加自己的HandleErrorAttribute所以也期待Error.cshtml視圖。請注意,我還安裝了Elmah.MVC NuGet包,但只是用於正確設置它。

是的,就注意到了這nuget.org是Elmah.MVC負責添加HandleErrorAttribute:

無痛整合ELMAH功能集成到ASP.NET MVC應用 。只需將該包放入ASP即可。NET MVC應用程序 和訪問/ elmah URL。它還將安裝全局HandleError過濾器, ,確保記錄所有未處理的錯誤(即使customError 已轉爲「開」)。

1

您也可以確保該HandleErrorAttribute沒有從全局過濾器取出,用Remove方法註冊:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Remove(new HandleErrorAttribute()); 
     /* ... your other filters */ 
    } 
}