2011-08-25 20 views
12

Tôi đã tìm thấy một câu hỏi khác được đăng trên đây cung cấp giải pháp cho phần đầu tiên của câu hỏi của tôi, tức là cách tạo trang 404 trong ASP.NET MVC WITHOUT chuyển hướng đến một trang khác (vì vậy url được yêu cầu ban đầu vẫn còn trong thanh địa chỉ).Ném 404 giống như StackOverflow, không có chuyển hướng, khi sử dụng IOCControllerFactory

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)); 

     } 
    } 

Các 404 bên thứ hoạt động tốt đối với tôi nếu tôi không sử dụng một IOCControllerFactory, nhưng ngay sau khi tôi làm sử dụng một nhà máy, mã lỗi trong global.asax không phải là đã sử dụng và thay vào đó tôi nhận được lỗi sau:

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

Làm cách nào để giải quyết vấn đề này, và tạo ra một hàm tạo tham số cho mỗi contr của tôi ollers?

+0

Xem [bài này] (http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404-in-asp-net-mvc/7967759#7967759), trong đó là một ví dụ về giải pháp trang lỗi 404 tùy chỉnh sử dụng thuộc tính bộ lọc ASP.Net MVC. Giải pháp này cũng tránh được thông báo 302/200 cho trình duyệt. Trình duyệt nhận được phản hồi 404. –

Trả lời

12

ASP.NET can do OOTB này (bắt đầu từ 3.5). Trên yếu tố <CustomErrors> thêm: redirectMode=ResponseRewrite

Cập nhật

tôi đăng sai mã. Đây là IIS 7 xử lý việc này.

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

Điều này không hoạt động theo MVC mặc dù không may, chỉ có biểu mẫu web. Tôi đã tìm thấy một bài viết về điều này và thử nó nhưng không có niềm vui cho MVC: ( – marcusstarnes

+0

Mã tôi đăng là từ một trong những dự án ASP.NET MVC của riêng tôi. Hoạt động tốt :) Nó được thử nghiệm bằng IIS 7. Bạn đã kiểm tra máy chủ web nào ? Tôi không chắc chắn nó sẽ làm việc với xây dựng trong phòng thu của dev. máy chủ. –

+0

Tôi vừa thử mã cập nhật này như trên (cả có và không có phần tùy chỉnh bổ sung trong phần system.web) nhưng không thành công. Tôi thực sự bị cấm 403 khi tôi gặp lỗi, thay vì trang lỗi tùy chỉnh của tôi. Khi tôi thêm phần customerrors bổ sung vào phần system.web, nó cũng đưa ra 403 nhưng đã đề cập đến SSL (?!), nhưng kiểm tra cấu hình IIS7 của tôi, tôi chưa bật SSL cho bất kỳ ứng dụng web nào. Bối rối! – marcusstarnes

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