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

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

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

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

Пример: /Seasons/Moober/Blue/1 -> /{category}/{parentGroup}/{group}/{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("List", "Item", new { category = "сезоны" }) И на этот раз никакие параметры не добавляются автоматически.

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


person Emanuel    schedule 08.08.2011    source источник
comment
Я могу, я просто надеюсь, что они не слишком длинные.   -  person Emanuel    schedule 08.08.2011


Ответы (3)


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

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, группу optional.

person Praveen Prasad    schedule 08.08.2011
comment
у вас не может быть более одного необязательного параметра, если вы не сделаете что-то вроде этого: haacked.com/archive/2011/02/20/ - person frennky; 08.08.2011
comment
Я использовал этот обходной путь weblogs.asp.net/imranbaloch/archive/2010/12/26/ для нескольких необязательных и последовательных параметров, однако сгенерированный URL-адрес в конце остается прежним, я попытаюсь смешайте это с предложенным frennky исправлением. - person Emanuel; 08.08.2011

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

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

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

person Husein Roncevic    schedule 08.08.2011

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

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

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

person Emanuel    schedule 23.05.2012