2017-02-16 54 views
0

我是MVC的新手,正在處理錯誤處理和異常。正如你可能會或可能不知道,通過視圖處理HTTP錯誤的實現是完全笨拙的,原因如下:ASP.NET MVC 5如何防止視圖顯示爲文本

1.)頁面狀態代碼設置爲200,這將導致錯誤頁面被索引一個搜索引擎,並讓用戶知道一切正常,這是不正確的。

2.)錯誤頁面的URL更改,我不想要。不幸的是,我無法將ResponseRewrite與View結合使用,因爲它使用了Server.Transfer,這意味着它會查找與View相對的文件。

我更喜歡使用View來處理所有應用程序異常和HTTP錯誤處理,因爲View通過在View啓動時調用_Layout.cshtml來維護站點佈局。因此,在過去一週內完成此工作之後,我想我找到了一個實現,它允許我在解決上述兩個問題的同時使用View(請參閱以下Web鏈接中的Starain Chen的解決方案1)。

我的問題是,對我來說,視圖正在所有文本中顯示。任何想法爲什麼會發生這種情況,更重要的是,如何強制網站被渲染而不是像文本一樣被拋棄?

https://forums.asp.net/t/1996026.aspx?How+to+keep+url+same+after+page+postback+with+error+in+MVC

我的代碼:

的web.config(截斷)

<system.web> 
    <customErrors mode="On" >  
    </customErrors> 
</system.web> 

<system.webServer> 
    <modules> 
     <remove name="FormsAuthentication" /> 
     <remove name="UrlRoutingModule-4.0" /> 
     <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />  
    </modules> 
</system.webServer> 

的Global.asax

namespace WebApplication1 
{ 
    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
     } 
     protected void Application_Error() 
     { 

      if (Context.IsCustomErrorEnabled) 
       ShowError(Server.GetLastError()); 
     } 

     private void ShowError(Exception exception) 
     { 
      var httpException = exception as HttpException ?? new HttpException(500, "Internal Server Error", exception); 

      Response.Clear(); 
      var routeData = new RouteData(); 
      routeData.Values.Add("Controller", "Error"); 
      routeData.Values.Add("fromAppErrorEvent", true); 
      routeData.Values.Add("ErrorMessage", httpException.Message); 
      routeData.Values.Add("httpStatusCode", httpException.GetHttpCode()); 
      switch (httpException.GetHttpCode()) 
      { 
       case 403: 
        routeData.Values.Add("action", "HttpError403"); 
        break; 
       case 404: 
        routeData.Values.Add("action", "HttpError404"); 
        break; 
       case 500: 
        routeData.Values.Add("action", "HttpError500"); 
        break; 
       default: 
        routeData.Values.Add("action", "GeneralError"); 
        break; 
      } 

      Server.ClearError(); 

      IController controller = new Controllers.ErrorController(); 
      controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 

     } 
    } 
} 

ErrorController

namespace WebApplication1.Controllers 
{ 
    public class ErrorController : Controller 
    { 
     // GET: Error 
     public ActionResult HttpError404() 
     { 
      ViewBag.errormessage = this.RouteData.Values["ErrorMessage"]; 
      ViewBag.status = this.RouteData.Values["httpStatusCode"]; 
      Response.StatusCode = Convert.ToInt32(this.RouteData.Values["httpStatusCode"]); 
      Response.TrySkipIisCustomErrors = true; 
      return View(); 
     } 
    } 
} 

HttpError404.cshtml查看

@{ 
    ViewBag.Title = "HttpError404"; 
} 

@*<h2>HttpError404</h2> 
ErrorMessge: @ViewBag.errormessage 
<br /> 
Status: @ViewBag.status*@ 
+1

不幸的是,這在MVC中並不像我本來那麼容易...... – mortb

+1

例如,您可以閱讀有關404處理的內容:http://stackoverflow.com/questions/619895/how-can-i -properly-handle-404-in-asp-net-mvc – mortb

+1

這是一個答案,我解釋瞭如何解決這個問題http://stackoverflow.com/a/38249656/5233410 – Nkosi

回答

0

問題是由項目是在Visual Studio 2013開放,奇怪的是引起的。關閉項目並在Firefox甚至Chrome中正確呈現視圖。在VS2013中打開該項目,Chrome和Firebox都會返回顯示文本的視圖。在VS2013打開項目時,IE必須具有一些代碼感知來呈現項目。離奇。