2012-07-18 37 views
5

Tôi có một ứng dụng web MVC 2 sắp được phát hành. Cho đến bây giờ tôi đã bị lỗi tùy chỉnh nhưng tôi muốn họ làm việc khi tôi đi sản xuất đã sẵn sàng.HandleErrorInfo sử dụng MVC2 - Mô hình là null?

Tôi đã thiết lập web.config của tôi như sau:

<customErrors mode="On" defaultRedirect="/Error/"> 
    <error statusCode="404" redirect="/Error/NotFound "/> 
</customErrors> 

Các 404 một hoạt động hoàn hảo, và notfound là một hành động mà bản đồ trực tiếp đến một Xem mà chỉ thấy một khá trang 404 chuẩn sử dụng của tôi tệp Site.Master riêng.

Đối với bất kỳ thứ gì ngoài 404, tôi muốn người dùng có thể xem chi tiết ngoại lệ. (Đây là một ứng dụng nội bộ, và không có rủi ro bảo mật khi làm như vậy).

Error hành động mặc định Index được đặt để trả về Chế độ xem() mà tôi đã xác định. Những gì tôi không thể tìm ra là làm thế nào để vượt qua các thông tin ngoại lệ vào View?

này trông đầy hứa hẹn:

http://devstuffs.wordpress.com/2010/12/12/how-to-use-customerrors-in-asp-net-mvc-2/

Nhưng khi tôi sử dụng Xem với:

<%@ Page Title="" Language="C#" 
    MasterPageFile="~/Views/Shared/Bootstrap.Master" 
    Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 

Các trang báo lỗi riêng của mình ném một lỗi, như HandleErrorInfo là null. Rõ ràng là một lỗi trong lỗi tùy chỉnh khiến cho MVC2 trở thành một loạt các vấn đề, và kết quả là một màn hình màu vàng của cái chết.

Tôi đoán hoặc là tôi đã bỏ lỡ khóa nào đó trong blog, hoặc không giải thích cách lấy HandleErrorInfo thành bất kỳ thứ gì khác ngoài null mà không thiết lập thuộc tính Lỗi cho mỗi bộ điều khiển/Hành động của tôi.

Ngoài ra, tôi biết rằng MVC3 đề với điều này tốt hơn, và tôi biết Razor là rất tốt. Nó chưa được sử dụng cho dự án này và dự án này sẽ không được thay đổi để sử dụng nó. Vì vậy, xin vui lòng không có "Sử dụng MVC3" câu trả lời.

Trả lời

12

HandleErrorInfo là không hợp lệ vì bạn đang thực hiện chuyển hướng trong customErrors.

Đây là ý tưởng tôi đang thử trong dự án mới nhất của mình và tôi đã cập nhật MVC 2. Tôi không sử dụng customErrors vì tôi không thể gọi hành động điều khiển mà không thực hiện chuyển hướng (tôi đoán).

Application Error

protected void Application_Error(Object sender, EventArgs e) 
{ 
    GlobalErrorHandler.HandleError(((HttpApplication)sender).Context, Server.GetLastError(), new ErrorController()); 
} 

lỗi toàn cầu xử lý

public class GlobalErrorHandler 
{ 
    public static void HandleError(HttpContext context, Exception ex, Controller controller) 
    { 
     LogException(ex); 

     context.Response.StatusCode = GetStatusCode(ex); 
     context.ClearError(); 
     context.Response.Clear(); 
     context.Response.TrySkipIisCustomErrors = true; 

     if (IsAjaxRequest(context.Request)) 
     { 
      ReturnErrorJson(context, ex); 
      return; 
     } 

     ReturnErrorView(context, ex, controller); 
    } 

    public static void LogException(Exception ex) 
    { 
     // log the exception 
    } 

    private static void ReturnErrorView(HttpContext context, Exception ex, Controller controller) 
    { 
     var routeData = new RouteData(); 
     routeData.Values["controller"] = "Error"; 
     routeData.Values["action"] = GetActionName(GetStatusCode(ex)); 

     controller.ViewData.Model = new HandleErrorInfo(ex, " ", " "); 
     ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(context), routeData)); 
    } 

    private static void ReturnErrorJson(HttpContext context, Exception ex) 
    { 
     var json = string.Format(@"success: false, error:""{0}""", ex.Message); 
     context.Response.ContentType = "application/json"; 
     context.Response.Write("{" + json + "}"); 
    } 

    private static int GetStatusCode(Exception ex) 
    { 
     return ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500; 
    } 

    private static bool IsAjaxRequest(HttpRequest request) 
    { 
     return request.Headers["X-Requested-With"] != null && request.Headers["X-Requested-With"] == "XMLHttpRequest"; 
    } 

    private static string GetActionName(int statusCode) 
    { 
     string actionName; 

     switch (statusCode) 
     { 
      case 404: 
       actionName = "NotFound"; 
       break; 

      case 400: 
       actionName = "InvalidRequest"; 
       break; 

      case 401: 
       actionName = "AccessDenied"; 
       break; 

      default: 
       actionName = "ServerError"; 
       break; 
     } 

     return actionName; 
    } 

    public static bool IsDebug 
    { 
     get 
     { 
      bool debug = false; 

#if DEBUG 
      debug = true; 
#endif 
      return debug; 
     } 
    } 
} 

Lỗi điều khiển

public class ErrorController : Controller 
{ 
    public ActionResult AccessDenied() 
    { 
     return View("AccessDenied"); 
    } 

    public ActionResult InvalidRequest() 
    { 
     return View("InvalidRequest"); 
    } 

    public ActionResult NotFound() 
    { 
     return View("NotFound"); 
    } 

    public ActionResult ServerError() 
    { 
     return View("ServerError"); 
    } 
} 

ServerError view

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    ServerError 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>ServerError</h2> 

    <% if (Model.Exception != null) { %> 
     <p> 
      Controller: <%= Model.ControllerName %> 
     </p> 
     <p> 
      Action: <%= Model.ActionName %> 
     </p> 
     <p> 
      Message: <%= Model.Exception.Message%> 
     </p> 
     <p> 
      Stack Trace: <%= Model.Exception.StackTrace%> 
     </p> 
    <% } %> 

</asp:Content> 
Các vấn đề liên quan