Url.Action () включает нежелательные параметры, пытаясь получить больше контроля - PullRequest
7 голосов
/ 08 августа 2011

У меня есть ссылка на странице, которая выглядит следующим образом:

Url.Action("List", "Item", new { category = "seasons" })

Маршрут, соответствующий этой странице, также имеет параметры parentGroup и group

Пример: / Seasons / Moober /Синий / 1 -> / {категория} / {parentGroup} / {группа} / {id}

Проблема в том, что когда я нахожусь на этой странице и использую Url.Action, он добавляет все недостающие значения маршрута дажекогда я пытаюсь сгенерировать ссылку только на категории / {category}, он все равно добавляет parentGroup и group.

Я нашел этот пост , который предлагает сделать это так:

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 ("Список", "Элемент", new {category = "seasons"}) И на этот раз параметры не добавляются автоматически.

Проблема в том, что я вынужден использовать именованные маршруты.

Ответы [ 3 ]

3 голосов
/ 08 августа 2011

Измените ваши маршруты

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.

0 голосов
/ 23 мая 2012

В конце я строю собственные ограничения для каждого маршрута.

http://msdn.microsoft.com/en-us/library/system.web.routing.route.constraints.aspx

Я обнаружил, что это дает почти полный контроль над тем, что мы хотим сделать с нашими маршрутами.

0 голосов
/ 08 августа 2011

Попробуйте объявить другие параметры как UrlParameter.Optional при регистрации маршрута и установите значение по умолчанию для этих параметров в вашем действии.Например.

MyAction(string category, string group = "", parentGroup = 0)

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

...