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
類中的代碼運行了兩次,大概是因爲它是全局註冊的,因爲它也在該方法中。有沒有辦法阻止它運行兩次?
謝謝。
完美,爲我工作。然而,就我的一般知識而言,我仍然好奇是否有辦法阻止屬性運行兩次,而不必處理異常。 – 2013-02-15 19:44:52
@MattPowell:你可以在'HttpContext.Items'中存儲一個標誌。 – SLaks 2013-02-15 22:00:18