2015-06-26 16 views
5

Tôi có một bộ lọc tùy chỉnh mà tôi đã sử dụng trong nhiều năm để xử lý RequestValidationException s theo cách thân thiện với người dùng hơn. Nó hoạt động mà không vấn đề trong tất cả các kịch bản cho đến khi tôi giới thiệu một Diện tích:Xử lý ASP.NET MVC RequestValidationException trong Area

public class HandleHttpRequestValidationExceptionAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     //base.OnException(filterContext); 

     if (!(filterContext.Exception is HttpRequestValidationException)) 
      return; 

     const string viewName = "~/Views/Errors/HttpRequestValidationException.cshtml"; 

     var result = new ViewResult 
     { 
      ViewName = viewName, 
      ViewData = { Model = filterContext.Exception.Message } 
     }; 

     //result.ViewBag.StatusCode = 200; 

     filterContext.Result = result; 
     filterContext.RouteData.Values["area"] = ""; 
     filterContext.ExceptionHandled = true; 
     filterContext.HttpContext.Response.Clear(); 
     filterContext.HttpContext.Response.StatusCode = 200; 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
     filterContext.HttpContext.Server.ClearError(); 
    } 
} 

... đăng ký tại FilterConfig:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     //filters.Add(new HandleErrorAttribute()); 
     filters.Add(new HandleMemberIsNotActivatedOrWaiveredAttribute()); 
     filters.Add(new HandleMemberNotAuthorizedException()); 
     filters.Add(new HandleHttpRequestValidationExceptionAttribute()); 
    } 
} 

Bất kỳ RequestValidationException ném được xử lý mà không vấn đề (tôi nhận được trang lỗi khá của tôi với một số mô tả thân thiện với người dùng về những gì đã xảy ra và phải làm gì với nó) trừ khi một người được ném vào một Khu vực. Trong trường hợp đó, tôi nhận được một phản ứng trống với customErrors = "On" (và YSOD chi tiết nếu customErrrors = "Off"). Nếu tôi xóa bộ lọc của mình, tôi sẽ nhận được YSOD không có chi tiết (cũng vô nghĩa). Dù bằng cách nào, Application_Error trong Global.asax.cs không bị sa thải. Hơn nữa, tất cả các bộ lọc tùy chỉnh khác của tôi và xử lý ngoại lệ toàn cục hoạt động mà không có bất kỳ vấn đề nào bất kể ngoại lệ được ném từ đâu.

Làm cách nào tôi có thể xử lý RequestValidationException theo cách thức thân thiện với người dùng bất kể nơi ngoại lệ bắt nguồn từ (bất kể nó có được ném từ bên trong một số Area) hay không?

Cập nhật: thậm chí thực hiện một kết quả trong cùng một trang trống (và bước qua nó cho biết tất cả đều tốt, nhưng không có phản hồi thích hợp).

Trả lời

0

Tôi tin rằng bạn sẽ cần chuyển tiếp mô hình lỗi ra khỏi vùng tới trình điều khiển lỗi của bạn để tạo chế độ xem. hoặc bạn sẽ phải điều khiển bộ điều khiển lỗi của bạn đến khu vực đó.

Nhìn vào liên kết này. Redirect From Action Filter Attribute

+0

Nó đã được đăng ký trên toàn cầu thông qua FilterConfig (và khi được debug'ed, nó đi qua nó một cách chính xác). Bạn đang nói đây là một cách kỳ quặc để đối phó với một ngoại lệ cực kỳ kỳ quặc? – Ted

+0

Và không. Không đi như mong đợi. Một lần nữa, đăng ký trong FilterConfig đăng ký nó trên toàn cầu rồi. Không cần phải ném nó như là một thuộc tính trên bộ điều khiển cụ thể sau đó. – Ted

+0

Có thể là một điều điên rồ để hỏi nhưng làm cách nào bạn chuyển hướng tuyến đường bên ngoài khu vực trở lại chế độ xem chính. wouldnt ~/Views/Errors/HttpRequestValidationException.cshtml tìm kiếm khung nhìn đó trong khu vực. –

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