2013-02-15 38 views
1

我通過創建自己的屬性來處理MVC中的HandleErrorAttribute,該屬性處理Ajax請求期間引發的異常。該屬性是在這裏:如何將已經是全局過濾器的屬性應用於未經過兩次運行的方法?

public class AjaxAwareHandleErrorAttribute : HandleErrorAttribute 
{ 
    public string PartialViewName { get; set; } 

    public override void OnException(ExceptionContext filterContext) 
    { 
     ExceptionHelper.HandleException(filterContext.Exception, false); // custom static class and method 
     base.OnException(filterContext); 

     // Use partial view in case of AJAX request 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      var result = new PartialViewResult {ViewName = PartialViewName ?? "~/Views/Errors/DefaultAjaxError.cshtml"}; 
      filterContext.Result = result; 
     } 
    } 
} 

正如你所看到的,存在的情況下默認行爲時PartialViewName爲空。這是因爲我把它註冊爲我的Global.asax文件的全局過濾器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new AjaxAwareHandleErrorAttribute()); 
} 

所以這個設置的方式,我有默認的行爲時異常Ajax調用過程中提出的,即DefaultAjaxError .cshtml將被返回。在這裏我想自定義消息的情況下,我創建一個視圖,它直接傳遞作爲PartialViewName一個屬性上的動作,這樣的:

[AjaxAwareHandleError(PartialViewName = "~/Views/Errors/CustomAjaxError.cshtml")] 
public ActionResult SomeAjaxControllerAction() 

在那裏我有裝飾用的控制器操作控制器的情況下的問題AjaxAwareHandleErrorAttribute類中的代碼運行了兩次,大概是因爲它是全局註冊的,因爲它也在該方法中。有沒有辦法阻止它運行兩次?

謝謝。

回答

0

filterContext.ExceptionHandled屬性設置爲true。

然後,在覆蓋頂部,檢查該屬性是否爲true並立即返回。

+0

完美,爲我工作。然而,就我的一般知識而言,我仍然好奇是否有辦法阻止屬性運行兩次,而不必處理異常。 – 2013-02-15 19:44:52

+0

@MattPowell:你可以在'HttpContext.Items'中存儲一個標誌。 – SLaks 2013-02-15 22:00:18

相關問題