MVC 4, динамически выбирайте MapRoute на лету
Я много гуглил, но все равно мне не повезло.
Это мое RouteConfig.cs
,
routes.MapRoute("BackRoute", "back/{controller}/{action}"
,new { controller = "Home", action = "Index" });
routes.MapRoute("Default", "{controller}/{action}"
,new { controller = "Home", action = "Index" });
Как видите, параметр один и тот же, но у меня есть бизнес-логика на выбор BackRoute
а также Default
из кода позади.
Могу ли я изменить маршрут с ActionFilterAttribute
?
public override void OnActionExecuting(ActionExecutingContext filterContext){
bool logic = true;
RouteValueDictionary rvd = filterContext.RouteData.Values;
if(logic){
filterContext = new RedirectToRouteResult("BackRoute",
new RouteValueDictionary(new {
controller = rvd["controller"].ToString()
, action = rvd["action"].ToString() }));
}
}
Ребята, можете ли вы предложить мне хороший способ достижения этой цели?
Заранее спасибо,
мир
1 ответ
Решение
В вашем атрибуте вы можете использовать:
filterContext.Result = new RedirectToRouteResult("BackRoute",
new RouteValueDictionary(
new { action = "Index", controller = "Home" });
ОБНОВЛЕНИЕ: бесконечный цикл означает, что вы перенаправляете на действие, вызываемое в первую очередь. Попробуйте добавить еще одну проверку перед установкой RedirectToRouteResult:
if(logic && filterContext.RouteData.Route != RouteTable.Routes["BackRoute"])
{
filterContext.Result = new RedirectToRouteResult("BackRoute",
new RouteValueDictionary(new {
controller = rvd["controller"].ToString()
, action = rvd["action"].ToString() }));
}