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)

Надеюсь это поможет.

Другие вопросы по тегам