Один из способов сделать это - определить фильтр исключений, который будет обрабатывать перенаправление для вас.
Сначала создайте пользовательское исключение для представления вашего перенаправления:
public class RedirectException : Exception {
private readonly string _url;
public RedirectException(string url) {
_url = url;
}
public string Url { get { return _url; }}
}
Затем определите фильтр исключений:
public class RedirectExceptionAttribute : FilterAttribute, IExceptionFilter {
public void OnException(ExceptionContext filterContext) {
if (filterContext.ExceptionHandled) return;
if (filterContext.Exception.GetType() != typeof(RedirectException)) return;
filterContext.Result = new RedirectResult(((RedirectException)filterContext.Exception).Url);
filterContext.ExceptionHandled = true;
}
}
Глобально зарегистрируйте новый фильтр исключений, чтобы он применялся ко всем действиям контроллера (если это то, что вам нужно):
// in FilterConfig.cs (MVC 4.0)
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new RedirectExceptionAttribute());
}
А теперь, куда бы вы ни захотели перенаправить, просто сгенерируйте исключение RedirectException:
private Thingy GetThingy(int id)
{
var thingy = some_call_to_service_layer(id);
if( null == thingy )
throw new RedirectException( anotherActionUrl );
// ... many more checks, all more complex than a null check
return thingy;
}
public ActionResult ActionOne(int id)
{
var thingy = GetThingy(id);
// do more stuff
return View();
}
// ... n more actions
public ActionResult ActionM(int id)
{
var thingy = GetThingy(id);
// do more stuff
return View();
}
Конечно, вам нужно убедиться, что вы не вызываете GetThingy()
из попытки / улова, или, если вы это сделаете, убедитесь, что вы повторно выбросили исключение.