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() }));
}
Другие вопросы по тегам