2016-06-07 62 views
0

我正在開發asp網絡mvc 5中的新網站。我想創建自定義的404頁面,用戶試圖訪問舊網址將被重定向。問題是我想爲這個錯誤頁面創建視圖並從url中獲取參數,試圖識別用戶試圖訪問的產品。但我還沒有找到解決方案如何創建它。所有編輯webconfig的示例都是這樣的:Asp網404頁面參數

<defaultRedirect="~/Errors/NotFound" mode="Off"> 
      <error statusCode="404" redirect="~/Errors/NotFound" />  
    </customErrors> 

不會傳遞參數。我試圖禁用自定義錯誤,並在Global.asax中的變化:

public void Application_Error(object sender, EventArgs e) 
     { 

      Exception exception = Server.GetLastError(); 
      Response.Clear(); 

      HttpException httpException = exception as HttpException; 
      if (httpException != null) 
      { 
       if(httpException.GetHttpCode() == 404) 
       {      
        var rd = new RouteData(); 
        rd.Values["controller"] = "Errors"; 
        rd.Values["action"] = "NotFound"; 
        rd.Values.Add("queryString", HttpContext.Current.Request.Url.AbsolutePath); 

        IController c = new ErrorsController(); 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
       } 

      } 
     } 

但它仍然會返回非標準錯誤頁面

enter image description here

+0

我還沒有看到重定向到一個錯誤頁面的那種方式之前。你嘗試過使用'return RedirectToAction(「NotFound」,「Errors」);'? –

+0

此外,如果您只是將錯誤頁面輸入到「http:// localhost:57623/Errors/NotFound」,會發生什麼? –

+0

我不相信傳遞參數的作用(至少不是在每種情況下 - 請記住,如果錯誤發生在IIS中,重定向發生在甚至調用ASP.NET之前)。但是,[本文](https://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging)會覆蓋這些選項,因爲它們適用於自定義頁面和日誌記錄。請注意,傳遞參數並不常見,因爲最佳做法是記錄錯誤併爲每個狀態代碼顯示一個通用頁面,否則黑客可以使用網站的輸出(參數)來查找漏洞。 – NightOwl888

回答

0

你可以試試這個:

RouteValueDictionary rvd = new RouteValueDictionary(){ 
{ 
    { "Controller", "Errors" }, 
    { "Action", "NotFound" } 
}; 
rvd["queryString"] = HttpContext.Current.Request.Url.AbsolutePath; 
Response.RedirectToRoute(rvd); 

希望這說得通。

+0

糟糕的是,這段代碼將返回狀態代碼200 – dantey89

+1

你必須在'ErrorsController'' NotFound'動作中將狀態重新設置爲404 ... – SamGhatak

+0

我認爲它會導致無限循環。我對嗎? – dantey89

0

你應該這樣編輯web.config文件:

<system.web> 
    <customErrors mode="On" defaultRedirect="~/Error"> 
     <error redirect="~/Error/NotFound" statusCode="404" /> 
    </customErrors> 
    </system.web> 
0

解決的辦法是比我想象的更容易。當你在webconfig

<defaultRedirect="~/Errors/NotFound" mode="On"> 
      <error statusCode="404" redirect="~/Errors/NotFound" />  
    </customErrors> 

設置自定義錯誤的請求的URL將在查詢字符串所以它是anough得到這樣的:

public ActionResult NotFound() 
     {     
      var requestedString = Request.QueryString["aspxerrorpath"]; 
      return View(); 
     } 
+1

xml看起來不正確。最上面的元素應該是:''。此外,默認錯誤頁面是「未找到」頁面似乎是錯誤的。我建議你創建一個通用的「錯誤發生」頁面,併爲404創建一個特定的頁面。 –

+0

另外還有一件事,在你對SamGhatak的回答發表評論時,你會提及在期待404時返回狀態代碼200.但我認爲你的方法會也返回狀態碼200.有幾種方法可以返回特定的狀態碼。看看這個問題:http://stackoverflow.com/questions/2948484/how-to-get-mvc-action-to-return-404 –

+0

@LarsKristensen,關於404狀態。 Asp網絡核心manualy設置302錯誤,當使用webconfig,這是可怕的。我查看了你發佈的鏈接,但是我不知道應該在哪裏寫404異常,而不是asp網絡核心拋出的302錯誤 – dantey89