2011-08-25 38 views
12

我發現了另一個問題發佈在這裏提供了我的問題的第一部分的解決方案,即如何生成ASP.NET MVC中的404頁面沒有重定向到另一個頁面(所以最初請求的url保留在地址欄中)。在使用IOCControllerFactory時拋出404像StackOverflow的,沒有重定向

ASP.NET MVC - How to throw a 404 page similar to that on StackOverflow

protected void Application_Error(object sender, EventArgs e) 
    { 
     var exception = Server.GetLastError(); 

     Response.Clear(); 
     var httpException = exception as HttpException; 
     var routeData = new RouteData(); 
     routeData.Values.Add("controller", "Error"); 

     if (httpException != null) 
     { 
      routeData.Values.Add("action", httpException.GetHttpCode() == 404 ? "NotFound" : "Unknown"); 

      // clear the error, otherwise, we will always get the default error page. 
      Server.ClearError(); 

      // call the controller with the route 
      IController errorController = new ErrorController(); 
      errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 

     } 
    } 

事物的404方工作正常,我如果我不使用IOCControllerFactory,但只要我使用一個工廠,在global.asax錯誤代碼是不二手而是我得到以下錯誤:

The IControllerFactory 'MyNamespace.IOCControllerFactory' did not return a controller for the name 'blah'.

如何解決這個問題,而不是訴諸擺脫我的ControllerFactory的,並創建一個參數的構造函數用於我的每一個對照品ollers?

+0

見[此篇](http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404-in-asp-net-mvc/7967759#7967759),其是使用ASP.Net MVC篩選器屬性的自定義404錯誤頁面解決方案的示例。該解決方案還避免了302/200消息到瀏覽器。瀏覽器得到一個404響應。 –

回答

12

ASP.NET can do此OOTB(從3.5開始)。 在 <CustomErrors>元素添加: redirectMode=ResponseRewrite

更新

我貼錯代碼。這是處理這個的IIS 7。

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="404" /> 
     <error statusCode="404" path="/home/notfound" responseMode="ExecuteURL" /> 
    </httpErrors> 
<system.webServer> 
+0

這不適用於MVC,但不幸的是,只有網頁形式。我發現了另一篇文章,並嘗試它,但沒有MVC的喜悅:( – marcusstarnes

+0

我發佈的代碼是從我自己的ASP.NET MVC項目之一。工作正常:)它使用IIS 7進行測試。 ?我不確定它會與Visual Studio的內置開發工作。服務器。 –

+0

我剛剛嘗試了這個更新後的代碼(在system.web部分中都有和沒有額外的客戶部分),但不幸的是沒有成功。當我遇到錯誤時,實際上我得到了403禁止,而不是我的自定義錯誤頁面。當我在system.web部分添加了一個額外的customerrors部分時,它也提供了403,但是提到了SSL(?!),但是檢查了我的IIS7配置,我沒有爲任何此Web應用程序啓用SSL。困惑! – marcusstarnes