2012-07-03 5 views
5

Sử dụng blog được đăng here và một chủ đề here trên SO tôi đã tạo một trình điều khiển sẽ xử lý tất cả các trang lỗi của tôi.MVC3 Trang lỗi tùy chỉnh cho kết quả trống

Trong Global.asax.cs của tôi, tôi đã có những đoạn mã sau đây:

protected void Application_Error() 
     { 
      var exception = Server.GetLastError(); 
      var httpException = exception as HttpException; 
      var routeData = new RouteData(); 

      Response.Clear(); 
      Server.ClearError(); 

      routeData.Values["controller"] = "Error"; 
      routeData.Values["action"] = "General"; 
      routeData.Values["exception"] = exception; 
      Response.StatusCode = 500; 

      if (httpException != null) 
      { 
       Response.StatusCode = httpException.GetHttpCode(); 
       switch (Response.StatusCode) 
       { 
        case 403: 
         routeData.Values["action"] = "Http403"; 
         break; 
        case 404: 
         routeData.Values["action"] = "Http404"; 
         break; 
       } 
      } 

      // Avoid IIS7 getting in the middle 
      Response.TrySkipIisCustomErrors = true; 
      IController errorsController = new ErrorController(); 
      HttpContextWrapper wrapper = new HttpContextWrapper(Context); 
      var rc = new RequestContext(wrapper, routeData); 
      errorsController.Execute(rc); 
     } 

ErrorController của tôi trông như thế này:

public class ErrorController : BaseController 
    { 
     /// <summary> 
     /// Returns a default view for not having access. 
     /// </summary> 
     public ActionResult Unauthorized() 
     { 
      BaseModel viewModel = new BaseModel 
             { 
              LoginModel = new LogonModel(), 
              ProfessionsTopX = GetTopXProfessions() 
             }; 
      return View(viewModel); 
     } 

     public ActionResult General(Exception exception) 
     { 
      return View("Exception", exception); 
     } 

     public ActionResult Http404() 
     { 
      //This line works 
      //return Content("Not found", "text/plain"); 

      //This line presents a blank page 
      return View("404","_Layout"); 
     } 

     public ActionResult Http403() 
     { 
      return View("403", "_Layout"); 
     } 

    } 

Và Razor View tôi chỉ chứa các mảnh html bên dưới;

@{ 
    ViewBag.Title = "404"; 
} 

<h2>404</h2> 

This is a 404 page! 

Khi tôi sử dụng Nội dung trả lại, tôi nhận được văn bản đơn giản cho tôi biết tôi đang xem trang 404. Tuy nhiên, tôi muốn trang 404 phù hợp với phần còn lại của thiết kế của tôi, vì vậy tôi muốn sử dụng Chế độ xem của riêng mình. Tuy nhiên ngay khi tôi sử dụng Return View, tôi nhận được một trang trống. Tôi hy vọng sẽ thiếu một cái gì đó rất rõ ràng, nhưng tôi không thấy nó.

+0

Điều chính xác tương tự đang xảy ra với tôi, xuống đến các bài đăng mà tôi đã mô hình hóa mã của mình sau đó. –

+0

Điều này cũng chính xác đang xảy ra với tôi. Bạn đã bao giờ tìm ra giải pháp cho vấn đề này chưa? –

Trả lời

4

Tôi đã gặp vấn đề tương tự và cuối cùng đã tìm ra giải pháp phù hợp với tôi. Bước đột phá đến khi tôi đặt một breakpoint trên dòng errorsController.Execute(rc);, và sử dụng 'bước vào' cho đến khi tôi tình cờ gặp ngoại lệ này:

The view 'Detail' or its master was not found or no view engine supports the 
searched locations. The following locations were searched: 
~/Views/Errors/Detail.aspx 
~/Views/Errors/Detail.ascx 
~/Views/Shared/Detail.aspx 
~/Views/Shared/Detail.ascx 
~/Views/Errors/Detail.cshtml 
~/Views/Errors/Detail.vbhtml 
~/Views/Shared/Detail.cshtml 
~/Views/Shared/Detail.vbhtml 

Trường hợp ngoại lệ bị nuốt, tôi giả sử vì nó đã xảy ra bên trong phương pháp Application_Error và bởi vì tôi đã đặt Response.TrySkipIisCustomErrors = true.

Sau khi thấy lỗi này, tôi nhanh chóng nhận ra sự cố của mình đơn giản là một tên không khớp: Bộ điều khiển của tôi thực sự có tên là ErrorController không có 's', không phải ErrorsController. Vấn đề đối với tôi là tôi đã đặt routeData.Values["controller"] = "Errors";, điều đó là sai. Chuyển nó sang routeData.Values["controller"] = "Error"; đã khắc phục được sự cố.

Lưu ý rằng bạn sẽ không gặp lỗi ngay lập tức, bởi vì bạn trực tiếp khởi tạo bộ điều khiển và nó sẽ không biên dịch nếu bạn có phần sai chính tả. Nhưng bên trong bộ điều khiển, gọi View() sẽ tìm kiếm khung nhìn bằng cách sử dụng cá thể RouteData mà chúng ta đã xây dựng và chuyển cho đối tượng RequestContext. Vì vậy, nếu tên bộ điều khiển được viết sai chính tả ở đó, MVC không biết nơi để tìm xem, và kể từ khi lỗi tùy chỉnh IIS được bỏ qua, nó không âm thầm.

Ngắn câu chuyện: Kiểm tra bộ điều khiển và xem tên của bạn. Tôi giả định một cái gì đó tương tự sẽ xảy ra nếu bạn có tên điều khiển chính xác, nhưng tên tập tin của xem không phù hợp.

+0

Không tìm thấy giải pháp nào, cảm ơn phản hồi của bạn! Có vẻ rất hợp lý. Sẽ cố gắng này ra càng sớm càng tốt và lấy lại cho bạn về nó! – Rob

+0

Thật ngu ngốc! Tôi đã đổi tên từ Lỗi thành Lỗi và sau đó có thể gỡ lỗi mọi thứ. Đầu tiên nhận thấy tôi vẫn đang nhận được một trang trắng, nhưng sau khi bước vào/thông qua tất cả mọi thứ tôi thấy một ngoại lệ sắp tới mà là dễ hiểu.Giải quyết nó và mọi thứ hoạt động. – Rob

0

Vui lòng kiểm tra xem nó ra this. Đó là cách tốt nhất để thực hiện xử lý ngoại lệ trong mvc.

Tôi đã thực hiện xử lý ngoại lệ giống nhau nhưng tôi đang gặp phải một số vấn đề nhưng bạn vẫn có thể tham khảo this.

+0

Đã thử nó đêm qua, nhưng tiếc là đã không giải quyết được vấn đề (chưa) Các đề xuất khác được hoan nghênh! – Rob