2010-02-12 11 views
6

Tôi có một bộ lọc ngoại lệ tùy chỉnh mà tôi đang gọi bởi đức hạnh của thêm một [CustomExceptionFilter] thuộc tính cho lớp học của tôi. Nó hoạt động như tôi muốn nó, tuy nhiên nếu phương thức hành động trả về một phần xem (thông qua một yêu cầu ajax), ngoại lệ (về cơ bản là một chuyển hướng đến một trang không được ủy quyền), đang tải chế độ xem một phần với trang. Có cách nào tôi có thể buộc nó tải lại url 'cha mẹ' không?asp.net mvc tùy chỉnh ngoại lệ bộ lọc để buộc một sự trở lại của xem đầy đủ, không phải một phần

Đây là mã cho các ngoại lệ tùy chỉnh lọc

public class CustomExceptionFilter : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception.GetType() == typeof(CustomSecurityException)) 
     { 
      filterContext.ExceptionHandled = true; 
      RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData); 
      string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "NoAccess", action = "Index", message = filterContext.Exception.Message })).VirtualPath; 
      filterContext.HttpContext.Response.Redirect(url, true); 
     } 
    } 
} 

Trả lời

2

Đây là điều mà bạn cần phải xử lý trên trình duyệt. Hãy thử xử lý error() on jQuery.ajax() call ví dụ (và rõ ràng là không trả lại chuyển hướng ..).

+0

Đây là câu trả lời đúng vì khi có lỗi ajax không phải ngoại lệ tùy chỉnh hoặc mã bộ điều khiển được nhấn. – stuartdotnet

0

Bạn có thể xác minh xem yêu cầu có phải là yêu cầu ajax hay không. Bạn có thể ví dụ như thực hiện như sau ...

if (!filterContext.HttpContext.Request.IsAjaxRequest()){ 
    //Return a ViewResult 
    //filterContext.ExceptionHandled = true; 
    //filterContext.Result = new ViewResult { ViewName = "Error" ... }; 
} 
else{ 
    //An ajax request. 
    //return a partial view 
} 

Tuy nhiên, như Maxwell cho biết bạn có thể để cho các bong bóng exeption lên nếu nó là một yêu cầu ajax và xử lý các lỗi trên máy khách. Bạn có thể thiết lập trên toàn cầu cách xử lý ngoại lệ trong các yêu cầu ajax như được mô tả here

1

Tôi khuyên bạn nên để bong bóng ngoại lệ cho khách hàng và xử lý nó như Maxwell đề xuất.

Trong dự án trước đây của chúng tôi, chúng tôi đã sử dụng một bộ lọc hành động cụ thể để xử lý lỗi ajax (mượn từ Suteki Shop). Lưu ý rằng trạng thái phản hồi là 500 (lỗi máy chủ nội bộ). Một trạng thái lỗi là cần thiết cho đáp ứng để gọi de error() ủy nhiệm trong một cuộc gọi JQuery.ajax().

public class HandleErrorWithAjaxAttribute : HandleErrorAttribute 
    { 
     public HandleErrorWithAjaxAttribute() 
     { 
      ShowStackTraceIfNotDebug = true; 
     } 

     public bool ShowStackTraceIfNotDebug { get; set; } 

     public override void OnException(ExceptionContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       string content = ShowStackTraceIfNotDebug || 
           filterContext.HttpContext.IsDebuggingEnabled 
            ? 
             filterContext.Exception.StackTrace 
            : 
             string.Empty; 
       filterContext.Result = new ContentResult 
              { 
               ContentType = MediaTypeNames.Text.Plain, 
               Content = content 
              }; 
       filterContext.HttpContext.Response.Status = 
        "500 " + filterContext.Exception.Message 
           .Replace("\r", " ") 
           .Replace("\n", " "); 
       filterContext.ExceptionHandled = true; 
       filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
      } 
      else 
      { 
       base.OnException(filterContext); 
      } 
     } 
    } 
0

Bạn đã thử xóa phản hồi chưa? Bộ điều khiển có thể vẫn đang thiết lập nội dung phản hồi.

filterContext.HttpContext.Response.Clear() 
filterContext.Result = new JsonResult { Data = new { Message = message } }; 
filterContext.HttpContext.Response.StatusCode = 500; 
filterContext.ExceptionHandled = true; 
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
1

Tôi sử dụng thẻ HanFer OnFailure trong thẻ biểu mẫu.

<form id="AJAXForm" method="post" action="" 
    onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event), 
    { insertionMode: Sys.Mvc.InsertionMode.replace, httpMethod: 'POST', 
    updateTargetId: 'myPartialPage', onSuccess: Function.createDelegate(this, ajaxFormSucced), 
    onFailure: Function.createDelegate(this, ajaxFormFailure) });" > 

... chức năng ajaxFormSucced() {// Mã cho sự thành công } chức năng ajaxFormFailure() {// Mã cho sự thất bại }

0

Liên kết này đã giúp tôi Handling ASP.NET MVC exceptions when posting to the controller via Ajax using jQuery

Cuối cùng, khi thử nghiệm javascript functio n, bắt đầu bằng cảnh báo trên dòng đầu tiên. Bất kỳ lỗi javascript nào trong hàm của bạn đều có khả năng dừng chức năng ở giữa thực thi mà không có phản hồi lỗi javascript thông qua trình duyệt (tùy thuộc vào thiết lập của bạn).

0

This sẽ giúp bạn.

Chỉ cần thêm.phương pháp khuyến nông IsAjaxRequest và trả lại 403 mã trạng thái trình duyệt, jquery ajaxError sẽ xử lý nó chuyển hướng đến trang đăng nhập

0

Như Maxwell nói, xử lý trên máy khách, sử dụng một cái gì đó như thế này

function handleError(ajaxContext) { 
    // Load parent 
} 

@using (Ajax.BeginForm("Index", "Home", new AjaxOptions 
{   
    UpdateTargetId = "MyDiv", 
    OnFailure = "handleError" 
})) 

gì bạn phải làm dù là đảm bảo trong mã ActionResult của bộ điều khiển cho NoAccess chứa mã sau, để lỗi ajax của bạn được kích hoạt.

HttpContext.Response.StatusCode = 401; 
Các vấn đề liên quan