2012-10-31 46 views
5

câu hỏi của tôi liên quan đến Pure.Kromes trả lời cho this post. Tôi đã thử triển khai các thông báo lỗi tùy chỉnh của trang bằng cách sử dụng phương pháp của mình, nhưng có một số vấn đề mà tôi không thể giải thích được.Các trang lỗi tùy chỉnh ASP.NET MVC với Magical Unicorn

a) Khi tôi kích hoạt lỗi 404 bằng cách nhập URL không hợp lệ, chẳng hạn như localhost: 3001/NonexistantPage, mặc định là hành động của trình điều khiển lỗi của tôi mặc dù nó sẽ đi tới NotFound(). Dưới đây là ErrorController tôi:

 
    public class ErrorController : Controller 
    { 
     public ActionResult NotFound() 
     { 
      Response.TrySkipIisCustomErrors = true; 
      Response.StatusCode = (int)HttpStatusCode.NotFound; 
      var viewModel = new ErrorViewModel() 
      { 
       ServerException = Server.GetLastError(), 
       HTTPStatusCode = Response.StatusCode 
      }; 
      return View(viewModel); 
     } 

     public ActionResult ServerError() 
     { 
      Response.TrySkipIisCustomErrors = true; 
      Response.StatusCode = (int)HttpStatusCode.InternalServerError; 

      var viewModel = new ErrorViewModel() 
      { 
       ServerException = Server.GetLastError(), 
       HTTPStatusCode = Response.StatusCode 
      }; 
      return View(viewModel); 
     } 
    } 

tuyến lỗi của tôi trong Global.asax.cs:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 

     routes.MapRoute(
      name: "Error - 404", 
      url: "NotFound", 
      defaults: new { controller = "Error", action = "NotFound" } 
      ); 

     routes.MapRoute(
      name: "Error - 500", 
      url: "ServerError", 
      defaults: new { controller = "Error", action = "ServerError" } 
      ); 


Và web.config của tôi cài đặt:

<system.web> 
    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/ServerError"> 
    <error statusCode="404" redirect="/NotFound" /> 
</customErrors> 
... 
</system.web> 

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" path="/NotFound" responseMode="ExecuteURL" /> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <error statusCode="500" path="/ServerError" responseMode="ExecuteURL" /> 
</httpErrors> 
... 

Quan điểm Lỗi được đặt trong/Views/Error/như NotFound.cshtml và ServerError.cshtml.

b) Một điều thú vị là, khi xảy ra lỗi máy chủ, thực tế hiển thị chế độ xem Lỗi máy chủ tôi đã xác định, tuy nhiên nó cũng xuất ra thông báo lỗi mặc định cũng như không thể tìm thấy trang Lỗi.

Here's how it looks like:


Bạn có bất cứ lời khuyên làm thế nào tôi có thể sửa chữa hai vấn đề này? Tôi thực sự thích Pure.Kromes tiếp cận để thực hiện các thông báo lỗi, nhưng nếu có những cách tốt hơn để đạt được điều này không hestitate để cho tôi biết.

Cảm ơn!

** CHỈNH SỬA: ** Tôi có thể điều hướng trực tiếp đến chế độ xem của mình thông qua ErrorController bằng cách truy cập/Lỗi/NotFound hoặc Lỗi/ServerError.

Bản thân chế độ xem chỉ chứa một số văn bản, không đánh dấu hoặc bất kỳ thứ gì.

Như tôi đã nói, nó thực sự hoạt động theo một cách nào đó, không phải cách tôi dự định nó hoạt động. Dường như có sự cố với chuyển hướng trong web.config, nhưng tôi không thể tìm ra nó.

+1

Bạn cũng có thể đăng lượt xem của mình không? Cũng đừng quên xóa 'GlobalFilters.Filters.Add (mới HandleErrorAttribute()); ' –

+1

Bạn có thể điều hướng trực tiếp đến trang 404 của mình không? –

+0

Có, tôi có thể. Vấn đề ở đây dường như bắt nguồn từ các cài đặt trong web.config, mặc dù tôi không thể tìm thấy lỗi ở đó. – FLClover

Trả lời

0

Tôi đã làm cho nó hoạt động. Có vẻ như sự hiểu biết của tôi về vấn đề này hơi sai khi bắt đầu.

Trong web.config, tôi đã thay đổi như sau:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Views/Error/ServerError.cshtml"> 
    <error statusCode="404" redirect="~/Views/Error/NotFound.cshtml" /> 
</customErrors> 

... và ...

<httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" path="/NotFound" responseMode="ExecuteURL" /> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <error statusCode="500" path="/ServerError" responseMode="ExecuteURL" /> 
    </httpErrors> 

này chuyển hướng trực tiếp đến các quan điểm. Sự hiểu biết của tôi là tôi đã phải chuyển hướng đến bộ điều khiển lỗi mà lần lượt sẽ chuyển hướng đến các khung nhìn, nhưng rõ ràng đây không phải là trường hợp. Tôi muốn cảm ơn bạn đã bình luận của bạn vì họ đã làm cho tôi phân tích vấn đề một lần nữa khi tôi đã được về chỉ mương những thứ lỗi tùy chỉnh và chỉ đơn giản là lười biếng và hiển thị YSOD. :)

2

có một vấn đề khác với thiết lập đó, khi bạn có nhiều tuyến đường phức tạp hơn và có nhiều phân đoạn cũ.

http://localhost:2902/dsad/dadasdmasda/ddadad/dadads/ddadad/dadadadad/ 

tôi đã nhận lỗi máy chủ ->

Sorry, an error occurred while processing your request. 


Exception: An error occured while trying to Render the custom error view which you provided, for this HttpStatusCode. ViewPath: ~/Views/Error/NotFound.cshtml; Message: The RouteData must contain an item named 'controller' with a non-empty string value. 
Source: 

giải pháp của tôi cho điều đó là để thêm đường thêm ở cuối sau khi tuyến đường mặc định

 routes.MapRoute(
      "Default Catch all 404", 
      "{controller}/{action}/{*catchall}", 
      new { controller = "Error", action = "NotFound" } 
     ); 

hy vọng nó có thể giúp một người nào đó :-)

+0

Bạn chính xác. Tôi sẽ kết hợp điều này vào các tuyến đường của tôi. Cảm ơn! – FLClover

Các vấn đề liên quan