Соответствие ASP.NET MVC маршрутов через / - PullRequest
0 голосов
/ 18 августа 2011

Я знаю, что когда существует маршрут в форме

Alpha/Bravo/{Charlie}

и другой в форме

Alpha/Bravo/Delta/{Echo}

, первый маршрут будет соответствовать всему для обоих маршрутов, потому что Delta /{Эхо} принимается как {Чарли}.Хотя это может быть проблемой при организации маршрутов, это также может быть полезно в целях упрощения.Я хотел бы иметь возможность использовать эту концепцию в середине строки маршрута.Я хотел бы, чтобы что-то вроде

Alpha/{Bravo}/Charlie

соответствовало URL-адресам вида

Alpha/bravo/Charlie

И

Alpha/bravo/bravo2/Charlie

Есть ли способ сделать это?

Ответы [ 2 ]

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

Я закончил тем, что добавил второй маршрут, так что теперь у меня есть

routes.MapRoute(
    "Route1",
    "Alpha/{Bravo}/{Charlie}/Delta",
    new { controller = "Alpha", action = "Delta" }
);

routes.MapRoute(
    "Route1",
    "Alpha/{Bravo}/Delta",
    new { controller = "Alpha", action = "Delta", Charlie = ""}
);

и в контроллере:

public ActionResult Delta(string Bravo, string Charlie)
{
    Bravo += Charlie;
    //everything else
}

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

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

Использовать маршрут регулярного выражения. Что-то вроде следующего может соответствовать параметру {variant} с 1 или более конечными цифрами

routes.MapRoute(
    "Title",
    "Controller/something/{variant}/Action",
    new { controller = "Controller", action = "Action" },
    new { variant = @"something\d+" }
);

Ваш маршрут выглядит немного странно (возможно, в нем отсутствуют некоторые фигурные скобки), но мой ответ описывает, как вы можете использовать регулярные выражения для ряда параметров в вашем маршруте.

С вашим точным маршрутом, Контроллер / что-то / {вариант} / Действие (опять же, это странно), мой сопоставленный маршрут будет перехватывать запросы вроде:

/Controller/something/something123/Action
/Controller/something/something1/Action

но не

/Controller/something/somethingelse/Action
/Controller/something/nothing/Action

Редактировать

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

Если вы хотите, чтобы более одного параметра были переменными, используйте более одного регулярного выражения

routes.MapRoute(
    "Title",
    "Controller/{something}/{variant}/Action",
    new { controller = "Controller", action = "Action" },
    new { variant = @"something\d+", something = @"(something|somethinglese)" }
);

Если вам нужно, чтобы {something} было необязательным, я не совсем помню, но вам, возможно, придется переместить его к последнему параметру и изменить маршрут на:

    routes.MapRoute(
    "Title",
    "Controller/{variant}/Action/{something}",
    new { controller = "Controller", action = "Action", something = UrlParameter.Optional },
    new { variant = @"something\d+", something = @"(something|somethinglese)" }
);
...