Url.Action() включает нежелательные параметры, пытаясь получить больше контроля
У меня есть ссылка на странице, которая выглядит так:
Url.Action("List", "Item", new { category = "seasons" })
Маршрут, соответствующий этой странице, также имеет параметры parentGroup и group
Пример: /Seasons/Moober/Blue/1 -> /{категория}/{parentGroup}/{группа}/{id}
Проблема в том, что когда я нахожусь на этой странице и использую Url.Action, он добавляет все недостающие значения маршрута, даже когда я пытаюсь сгенерировать ссылку только на категории /{category}, он все равно добавляет parentGroup и группу.
Я нашел этот пост, который предлагает сделать это так:
Url.Action("List", "Item", new { category = "seasons", group = "", parentGroup = "" })
Но это не работает для меня, так как удаляет их из моего URL, но добавляет их в качестве параметров: /Seasons? ParentGroup=Moober&group=Blue
Я использую MVC3. Есть ли способ заставить Url.Action() использовать только предоставленные параметры или отменить те, которые мне не нужны?
Вот маршруты.
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"ItemFromCategoryParentGroupSubGroup", // Route name
"{category}/{parentGroup}/{group}/{id}/{language}", // URL with parameters
new { controller = "Item", action = "Show", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
new
{
category = _validCategory,
parentGroup = _validGroup,
group = _validChildGroup,
id = _validItemInChildGroup
}
);
routes.MapRoute(
"ItemListFromParentGroup", // Route name
"{category}/{parentGroup}/{group}/{language}", // URL with parameters
new { controller = "Item", action = "List", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
new
{
category = _validCategory,
parentGroup = _validGroup,
group = _validChildGroup
}
);
routes.MapRoute(
"ItemWithGroup", // Route name
"{category}/{group}/{id}/{language}", // URL with parameters
new { controller = "Item", action = "Show", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
new
{
category = _validCategory,
group = _validGroup,
id = _validItemInGroup
}
);
routes.MapRoute(
"ItemListWithGroup", // Route name
"{category}/{group}/{language}", // URL with parameters
new { controller = "Item", action = "List", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
new
{
category = _validCategory,
group = _validGroup
}
);
routes.MapRoute(
"ItemListFromCategory", // Route name
"{category}/{language}", // URL with parameters
new { controller = "Item", action = "List", page = 1, language = ConfigurationManager.AppSettings["DefaultLanguage"] }, // Parameter defaults
new
{
category = _validCategory
}
);
Редактировать:
На данный момент у меня есть обходной путь, который выглядит следующим образом: Url.RouteUrl("ItemListFromCategory") Я в основном форсирую тот же маршрут, который должен соответствовать Url.Action("Список", "Элемент", новый { category = "seasons" }) И на этот раз параметры не добавляются автоматически.
Проблема в том, что я вынужден использовать именованные маршруты.
3 ответа
В конце я строю собственные ограничения для каждого маршрута.
http://msdn.microsoft.com/en-us/library/system.web.routing.route.constraints.aspx
Я обнаружил, что это дает почти полный контроль над тем, что мы хотим сделать с нашими маршрутами.
Измените свои маршруты
routes.MapRoute(
"SomeRoute", // Route name
"/{category}/{parentGroup}/{group}/{id}",
new {
controller = "DefaultController",
action = "DefaultAction",
parentGroup = UrlParameter.Optional
group = UrlParameter.Optional
id= UrlParameter.Optional
}
);
Сделать parentGroup, parentGroup, group optional
,
Попробуйте объявить другие параметры как UrlParameter.Optional при регистрации маршрута и установите значение по умолчанию для этих параметров в вашем действии. Например.
MyAction(string category, string group = "", parentGroup = 0)
Надеюсь это поможет.