Я предлагаю использовать атрибут фильтра.Вы можете реализовать что-то вроде этого:
public class RedirectOnErrorAttribute : FilterAttribute, IExceptionFilter {
bool IsPartialRequest = false;
public void OnException(ExceptionContext filterContext) {
if(filterContext.ExceptionHandled) return;
/*then you can redirect to a specific page or to, for example,
special error handling controller*/
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Error", action = "HandleError", isPartialError = IsPartialRequest }));
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
}
}
А в контроллере обработки ошибок в методе действия HandleError
вы можете вернуть определенный View в зависимости от параметра isPartialError
.Кстати, вы можете сделать другие полезные вещи в этом методе действия - например, записать информацию об ошибке в журнале.
Чтобы использовать этот атрибут, вы можете украсить его классами контроллера:
[RedirectOnError]
public class MyController : Controller {
public ViewResult Index () {}
public ActionResult Create() {}
[RedirectOnError(IsPartialRequest=true)]
public PartialViewResult ListCategories() {}
}
обратите вниманиена использование атрибута методом ListCategories
- я прямо сказал, что это частичный запрос.Причина, по которой я это сделал, проста - система маршрутизации ничего не знает о том, что результат будет использоваться как частичный.