2012-07-03 53 views
5

使用貼here博客和,所以我已經創建了一個控制器,它應該處理我所有的錯誤頁面的主題hereMVC3自定義錯誤頁給出空白結果

在我的Global.asax.cs我已經得到了下面的一段代碼:

protected void Application_Error() 
     { 
      var exception = Server.GetLastError(); 
      var httpException = exception as HttpException; 
      var routeData = new RouteData(); 

      Response.Clear(); 
      Server.ClearError(); 

      routeData.Values["controller"] = "Error"; 
      routeData.Values["action"] = "General"; 
      routeData.Values["exception"] = exception; 
      Response.StatusCode = 500; 

      if (httpException != null) 
      { 
       Response.StatusCode = httpException.GetHttpCode(); 
       switch (Response.StatusCode) 
       { 
        case 403: 
         routeData.Values["action"] = "Http403"; 
         break; 
        case 404: 
         routeData.Values["action"] = "Http404"; 
         break; 
       } 
      } 

      // Avoid IIS7 getting in the middle 
      Response.TrySkipIisCustomErrors = true; 
      IController errorsController = new ErrorController(); 
      HttpContextWrapper wrapper = new HttpContextWrapper(Context); 
      var rc = new RequestContext(wrapper, routeData); 
      errorsController.Execute(rc); 
     } 

我ErrorController看起來是這樣的:

public class ErrorController : BaseController 
    { 
     /// <summary> 
     /// Returns a default view for not having access. 
     /// </summary> 
     public ActionResult Unauthorized() 
     { 
      BaseModel viewModel = new BaseModel 
             { 
              LoginModel = new LogonModel(), 
              ProfessionsTopX = GetTopXProfessions() 
             }; 
      return View(viewModel); 
     } 

     public ActionResult General(Exception exception) 
     { 
      return View("Exception", exception); 
     } 

     public ActionResult Http404() 
     { 
      //This line works 
      //return Content("Not found", "text/plain"); 

      //This line presents a blank page 
      return View("404","_Layout"); 
     } 

     public ActionResult Http403() 
     { 
      return View("403", "_Layout"); 
     } 

    } 

我的Razor視圖只包含一張下面的HTML;

@{ 
    ViewBag.Title = "404"; 
} 

<h2>404</h2> 

This is a 404 page! 

當我使用返回內容我得到一個純textoutput告訴我,我看404頁。不過,我希望404頁面適合我設計的其餘部分,所以我想使用我自己的Views。但是,一旦我使用返回視圖,我得到一個空白頁面。我希望錯過一些非常明顯的東西,但我沒有看到它。

+0

這同樣的事情發生在我身上,直到後來我模擬我的代碼的帖子。 –

+0

這件事情發生在我身上。你有沒有找到這個問題的解決方案? –

回答

4

我有同樣的問題,終於發現我工作的解決方案。

The view 'Detail' or its master was not found or no view engine supports the 
searched locations. The following locations were searched: 
~/Views/Errors/Detail.aspx 
~/Views/Errors/Detail.ascx 
~/Views/Shared/Detail.aspx 
~/Views/Shared/Detail.ascx 
~/Views/Errors/Detail.cshtml 
~/Views/Errors/Detail.vbhtml 
~/Views/Shared/Detail.cshtml 
~/Views/Shared/Detail.vbhtml 

正在吞食例外,我想是因爲它是Application_Error事件中發生的事情和:直到我碰到這個例外就取得了突破,當我放置在errorsController.Execute(rc);行設置一個斷點,並用「步入」因爲我已經設置了Response.TrySkipIisCustomErrors = true

看到這個錯誤後,我很快意識到我的問題只是一個不匹配的名稱:我的控制器實際上被命名爲ErrorController,沒有's',而不是ErrorsController。對我來說問題是我已經設置了routeData.Values["controller"] = "Errors";,這是錯誤的。切換到routeData.Values["controller"] = "Error";解決了這個問題。

注意,你不會趕上錯誤馬上,因爲你直接實例化控制器,如果您有部分拼寫錯了,它不會編譯。但在控制器內部,調用View()將使用我們構造的RouteData實例查找視圖,並將其傳遞給RequestContext對象。因此,如果控制器名稱在這裏拼寫錯誤,MVC不知道在哪裏尋找視圖,並且由於IIS自定義錯誤被忽略,它會自動失敗。

長話短說:檢查您的控制器和視圖名稱。如果您的控制器名稱正確,但我認爲類似的情況會發生,但視圖的文件名稱不匹配。

+0

沒有沒有找到解決方案,謝謝你的迴應!看起來非常合乎邏輯。將盡快嘗試此事並回復您! – Rob

+0

多麼愚蠢!我將錯誤名稱更改爲錯誤,然後能夠調試所有內容。首先注意到我仍然在看一個白頁,但在進入/瀏覽所有內容後,我看到了一個可以理解的異常。解決它,一切正常。 – Rob

0

請檢查出來this。這是在mvc中實現異常處理的最佳方式。

我已經實現了相同的異常處理,但我面臨着一些問題,但你仍然可以參考this

+0

昨晚試了一下,但不幸的是沒有解決問題(還)歡迎其他建議! – Rob