2008-11-21 19 views
44

Có thể tạo ra một tuyến đường cuối cùng mà bắt tất cả .. và bị trả lại người dùng đến một cái nhìn 404 trong ASP.NET MVC?Làm thế nào để bắt tất cả tuyến đường để xử lý các truy vấn 'không tìm thấy trang 404' cho ASP.NET MVC?

LƯU Ý: Tôi không muốn thiết lập điều này trong cài đặt IIS của mình.

+0

Xem câu trả lời của tôi để "http://stackoverflow.com/questions/619895/how-can-i-properly-handle- 404-trong-asp-net-mvc/23830145 # 23830145 ". –

Trả lời

66

Tìm câu trả lời cho chính mình.

Richard Dingwall có bài đăng tuyệt vời trải qua các chiến lược khác nhau. Tôi đặc biệt thích giải pháp FilterAttribute. Tôi không phải là fan hâm mộ của ném ngoại lệ xung quanh Willy nilly, vì vậy tôi sẽ xem liệu tôi có thể cải thiện mà :)

Đối với global.asax, chỉ cần thêm đoạn mã này như tuyến đường cuối cùng của bạn để đăng ký:

routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "StaticContent", action = "PageNotFound" } 
    ); 
+6

Tôi đã thử điều này, nhưng nó không hoạt động. Tôi đã đặt tuyến đường theo tuyến đường mặc định của mình, nhưng tôi vẫn gặp lỗi 404. – Martijn

+0

Hmm. tôi nghĩ nó hoạt động cho tôi. –

+0

Bạn có thể vui lòng giải thích chính xác những gì tôi có để giả định tôi rất mới với MVC. – Tanmoy

3

Đây có thể là một vấn đề khi bạn sử dụng

throw new HttpException(404); 

khi bạn muốn bắt đó, tôi không biết bất kỳ cách nào khác sau đó chỉnh sửa cấu hình web của bạn.

+0

ActionFilters: sử dụng chúng để nắm bắt HttpException. –

+0

Điều gì sẽ xảy ra nếu ngoại lệ không bị tác động bởi bộ điều khiển? Tôi ném một 404 trong nhà máy điều khiển của tôi. – Paco

+0

Không chắc chắn sau đó - tôi không chơi xung quanh với các nhà máy điều khiển. soz. –

17

Câu hỏi này đến đầu tiên, nhưng câu trả lời dễ dàng bước vào một câu hỏi sau:

Routing for custom ASP.NET MVC 404 Error page

I got my error handling to work by creating an ErrorController that returns the views in this article. I also had to add the "Catch All" to the route in global.asax.

I cannot see how it will get to any of these error pages if it is not in the Web.config..? My Web.config had to specify:

customErrors mode="On" defaultRedirect="~/Error/Unknown" 

and then I also added:

error statusCode="404" redirect="~/Error/NotFound" 

Hope this helps.

Tôi yêu theo cách này bây giờ bởi vì nó rất đơn giản:

<customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect"> 
    <error statusCode="404" redirect="~/Error/PageNotFound/" /> 
</customErrors> 
+0

Đó là những gì tôi có bây giờ, nhưng tôi đang cố gắng để thay thế nó bằng một giải pháp tốt hơn mà trước tiên sẽ không gửi một phản ứng 302 cho khách hàng nhưng một 404 trực tiếp. Thay đổi redirectMode thành ResponseRewrite và bạn sẽ thấy nó không hoạt động nữa ... :-( –

+2

@LouisSomers Vì câu trả lời này, tôi đã tìm ra cách tốt hơn là cách được mô tả trong câu hỏi này: http://stackoverflow.com/question/1171035/asp-net-mvc-custom-lỗi-xử lý-ứng dụng-lỗi-toàn cầu-asax Tôi không muốn chuyển hướng người dùng đến một URL khác vì nó ít thân thiện với người dùng hơn (thậm chí tôi thấy khó chịu khi phát triển – smdrager

+0

Tôi gặp lỗi 'Lỗi cấu hình: Không thể đọc phần cấu hình 'customErrors' vì thiếu phần khai báo'. – alex

2

Thêm dòng này trong tệp web.config gốc của dự án của bạn.

<system.webServer> 
<httpErrors errorMode="Custom" existingResponse="Replace"> 
    <remove statusCode="404" /> 
    <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" /> 
    <remove statusCode="500" /> 
    <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" /> 
</httpErrors> 
<modules> 
    <remove name="FormsAuthentication" /> 
</modules> 

0

Nếu con đường không thể được giải quyết, sau đó khung MVC sẽ thông qua lỗi 404 .. cách tiếp cận tốt nhất là sử dụng bộ lọc ngoại lệ ... Tạo một exceptionfilter tùy chỉnh và thực hiện như thế này ..

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter { 
    public void OnException(ExceptionContext filterContext) { 
     filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html"); 
    } 
} 
0

Bên RouterConfig.cs thêm đoạn mã follwing:

routes.MapRoute(
      name: "Error", 
      url: "{id}", 
      defaults: new 
      { 
       controller = "Error", 
       action = "PageNotFound" 

      }); 
3

Ngoài ra bạn có thể xử lý không tìm thấy lỗi trong Global.asax.cs như sau

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception lastErrorInfo = Server.GetLastError(); 
    Exception errorInfo = null; 

    bool isNotFound = false; 
    if (lastErrorInfo != null) 
    { 
     errorInfo = lastErrorInfo.GetBaseException(); 
     var error = errorInfo as HttpException; 
     if (error != null) 
      isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound; 
    } 
    if (isNotFound) 
    { 
     Server.ClearError(); 
     Response.Redirect("~/Error/NotFound");// Do what you need to render in view 
    } 
} 
Các vấn đề liên quan