0

我想在我的asp.net mvc3網站自定義錯誤頁面。更改自定義Http404錯誤頁面的默認視圖文件夾

所以,我發現這非常有用的帖子:Custom error pages on asp.net MVC3,而且運作良好

但是,我Http404.cshtml文件不在Views默認文件夾。它位於名爲BaseViews的文件夾中。 我已經有我的_Layout.cshtml和該文件夾中的其他視圖或部分視圖。

此文件夾沒有被默認的ViewEngine(它只檢查Views文件夾和我的Areas的所有views文件夾)檢查。因此,我使用ViewEngineExtension並將其添加到我的Global.asaxApplication_Start()中的System.Web.Mvc.ViewEngines集合中。我的所有應用程序工作得很好,可以訪問我的佈局和其他東西。我不能說Global.asaxApplication_Error()。此方法忽略了以前的視圖引擎,只能查看默認視圖文件夾。 我試圖像ViewEngines.Engines.Add(new BaseViewsEngineExtension());那樣在Application_Error()方法中添加我的ViewEngineExtension,但它不會改變任何東西。這與我在Application_Start()中使用的完全一樣。

見我的代碼爲Application_Error()

protected void Application_Error() 
{ 
    var exception = Server.GetLastError(); 
    var httpException = exception as HttpException; 
    Response.Clear(); 
    Server.ClearError(); 
    var routeData = new RouteData(); 
    routeData.Values["controller"] = "Error"; 
    routeData.Values["action"] = "Index"; 
    routeData.Values["exception"] = exception; 
    Response.StatusCode = 500; 
    if (httpException != null) 
    { 
     Response.StatusCode = httpException.GetHttpCode(); 
     switch (Response.StatusCode) 
     { 
      case 404: 
       routeData.Values["action"] = "Http404"; 
       break; 
     } 
    } 

    IController errorController = new ErrorController(); 
    var rc = new RequestContext(new HttpContextWrapper(Context), routeData); 
    errorController.Execute(rc); 
} 

我的問題是:我怎麼能強迫errorController.Excecute(rc)視圖引擎來搜索我Http404.cshtml視圖中BaseViews文件夾?

回答

0

正如SLaks所說,您應該在ErrorController中返回視圖的完整路徑。

public class ErrorController : Controller 
    { 
     public ActionResult Http404() 
     { 
      return View("~/BaseViews/Error/Http404.cshtml"); 
     } 
    } 

但它不起作用,因爲你的錯誤被覆蓋,所以你沒有得到預期的結果。 要繞過這個問題,你可以告訴你的應用程序,一切都與這個在你的Application_Error OK:

Request.StatusCode = 200; 

我希望它會解決你的問題。

+0

我仍然不知道如何在'Application_error'中定義視圖引擎,但沒關係。將'StatusCode'改爲200就可以了,謝謝。 – Florent 2012-08-02 10:19:00

0

更改Http404操作將完整路徑返回到其視圖。

+0

我不確定明白你的意思嗎?你能更具體嗎? – Florent 2012-08-01 19:24:16