Динамический маршрут ASP.NET MVC, который совпадает с контроллером / действием по умолчанию - PullRequest
0 голосов
/ 14 марта 2011

Мне нужны маршруты, чтобы соответствовать иногда контроллерам, а иногда - значениям базы данных.Вот пример:

/ controller / action? Id = test - это маршрут по умолчанию {controller} / {action}

/ name / type? Flag = test - это мой заказ{dbvalue} / {dbvalue} route

Как видите, оба маршрута одинаковы.Но если {controller} или {action} - это конкретное значение (известно только во время выполнения, потому что оно зависит от БД) - мне нужен маршрут, соответствующий моему другому маршруту (например, / specificcontroller / handleall (действие строки, имя строки)).

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 14 марта 2011

ОК, ответ будет заключаться в реализации IRouteConstraint для исключения значений БД из значений {контроллера}, принятых по маршруту по умолчанию.

например.

 routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },  // Parameter defaults
            new { controller = new ExcludeValuesConstraint("dbvalue1", "dbvalue2") }
        );

Конечно, исключенные значения должны быть динамическими.

Хитрость заключалась не в том, чтобы добавить ограничения к моему маршруту, а в том, чтобы исключить значения из маршрута по умолчанию.

0 голосов
/ 14 марта 2011

Это еще не проверено, но только идея:

Global.asax:

routes.MapRoute("DbRoute", "{dbValue1}/{dbValue2}", new {controller = "RouteController", action = "Index"});
routes.MapRoute("Default", "{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = UrlParameter.Optional});

затем в действии метода Index() внутри класса RouteController, вы проверяете на dbValue1 и dbValue2.Если не совпадает, вы можете использовать метод RedirectToRoute("Default", ...).

Таким образом, любой запрос сначала будет соответствовать DbRoute, а RouteController проверит значение db, если не совпадает, просто перенаправьте маршрут наDefault и визуализация представления на основе контроллер / действие .

...