2011-05-10 85 views
3

我一直在本指南中的HandleError屬性如下: blogs.msdn.com 我用像這樣(的AccountController):MVC3的HandleError不顯示錯誤頁面

[HandleError(View="ErasErrorPage")] 
     public ActionResult Index() 
     { 
      ViewBag.admins = _accountMapper.GetAdmins(false); 
      ViewBag.members = _accountMapper.GetMembers(false); 
      ViewBag.Countries = _countryMapper.GetCountries(); 

      return View(); 
     } 

此代碼拋出一個異常,因爲_accountMapper.GetAdmins(false)失敗因爲System.Data.EntityException的。

我已將ErasErrorPage視圖放入我的共享文件夾中,並添加了<customErrors mode="On"/>,但ErasErrorPage不顯示。當發生錯誤時我得到的所有信息都是一個黃色的死亡屏幕:

Error 顯然,將模式設置爲「Off」或「RemoteOnly」並不能解決問題。

任何人有一個想法,爲什麼這不起作用?


編輯

如果我直接衝浪http://localhost:3527/Account/Index,我得到了正確的ErasErrorPage,但我不希望出現這種情況。我想,當一個異常被拋出某處的網站重定向全自動到該頁面。這可能嗎?


EDIT2

我已經把[HandleError(View="ErasErrorPage")]屬性每一個Public ActionResult methodName() { ... }方法之前正確的,我仍然得到死亡的黃屏說我需要改變模式「關閉」或‘僅限遠程’......

+0

這是一個非常古老的問題,但人們通過它絆腳石。你必須有customErrors =「On」,並且異常必須產生一個500類錯誤,拋出一個403並且它不會被觸發,它不會處理已經被處理的子動作或異常,並且異常必須從System派生。例外,沒有土着。一個簡單的測試方法就是簡單地移除View屬性,檢查它是否至少觸發到默認的Error頁面。如果是這樣,你知道它的路徑錯誤等自定義視圖。 – rism 2015-05-23 12:43:27

回答

3

因爲這並不在所有的工作顯示自定義錯誤頁,我已經找到了一個很好的替代:

Custom error pages on asp.net MVC3

我也發現了失敗的原因:

我們試圖在我們嘗試渲染視圖之前連接到數據庫。 HandleError屬性甚至不會被那個(我認爲)觸發。上述方法確實可以做到這一點。它在任何地方處理任何異常。

3

確保ErasErrorPage觀點本身並不拋出異常。下面是我做和步驟工作得很好,我:

  1. 使用默認的Visual Studio嚮導創建一個新的ASP.NET MVC 3項目
  2. 添加~/Views/Shared/ErasErrorPage.cshtml具有以下內容:

    @{ 
        Layout = null; 
    } 
    <!DOCTYPE html> 
    <html> 
    <head> 
        <title>ErasErrorPage</title> 
    </head> 
    <body> 
        <div> 
         OOPS 
        </div> 
    </body> 
    </html> 
    
  3. 修改HomeContoller看起來像這樣:

    public class HomeController : Controller 
    { 
        [HandleError(View = "ErasErrorPage")] 
        public ActionResult Index() 
        { 
         throw new Exception("oops"); 
        } 
    } 
    
  4. 在網頁。配置放:

    <customErrors mode="On" /> 
    
  5. 導航到/Home/Index =>預期

+0

請參閱我對原始問題的編輯。 – Matthias 2011-05-10 09:04:56

+0

@Matthias,你只用這個屬性裝飾了索引動作。如果你想爲所有的動作使用這個自定義的錯誤頁面,你可以寫一個自定義的句柄錯誤屬性並將其註冊爲全局過濾器,或者擁有一個基礎控制器,所有你的控制器派生自該控制器,並且該控制器被修飾。 – 2011-05-10 09:47:47

+0

@Darin:是的,我認爲那可能會起作用......那麼您能否舉一個例子來說明如何去做?因爲我不需要在所有ActionResult方法之上添加[CustomError]屬性? – Matthias 2011-05-10 09:50:22

1

它的工作,我有一個屬性[HandleError(View = "Error")]並與動態模型共享的錯誤觀點一BaseController(應該是HandleErrorInfo),並在HomeController的Index操作,我拋出一個異常:

throw new Exception("Test exception"); 

然後呈現錯誤視圖並顯示正確的信息。

ErrorView:

<div class="errorMessage"> 
    <h1 class="errorHeader">@Model.Exception.GetType().Name</h1> 
    <cite class="errorAction">thrown in @Model.ControllerName @Model.ActionName</cite> 
    <p class="errorMessage">thrown in @Model.Message</p> 
</div> 
+0

'這個評論是來自某人的建議編輯:'編輯,因爲我不能評論:我可以驗證這也適用於我,但只有當我設置'Response.StatusCode =(int)HttpStatusCode.OK;'in自定義錯誤視圖。否則,即使生成了ErrorView中的視圖,該響應也會被替換爲通用的500錯誤頁面。 – 2012-12-13 05:47:11