Раньше я не использовал .NET Routing. У меня есть URL: http://myurl.com/Account/Login/?IsIPA=true . Я хочу получить доступ к этому URL с помощью следующего: http://myurl.com/IPA

Это единственный пользовательский маршрут, по которому я хочу попасть.

Могу ли я создать маршрут только для одного такого URL?

Мой код, который не работает:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapMvcAttributeRoutes();

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    routes.MapRoute("IPA", "Account/Login/{IsIPA}", new { controller = "Account", action = "Login", IsIPA = "true" });
}

Я получаю сообщение об ошибке:

Запись ограничения IsIPA на маршруте с шаблоном маршрута Account/Login/{IsIPA}=True должна иметь строковое значение или иметь тип, реализующий System.Web.Routing.IRouteConstraint.

6
Rhys Stephens 3 Мар 2015 в 08:07

2 ответа

Лучший ответ

Сопоставление маршрутов похоже на оператор switch case. Параметр url, а также любые значения и ограничения по умолчанию рассматриваются для определения того, соответствует ли он входящему URL-адресу. Если маршрут совпадает, он создаст словарь значений маршрута на основе конфигурации. Если маршрут не совпадает, пробуется следующий маршрут в коллекции, пока совпадение не будет найдено (или не найдено).

Это означает, что порядок указания маршрутов важен. Маршрут по умолчанию соответствует любому URL с 0, 1, 2 или 3 сегментами. Поэтому в большинстве случаев вам нужно будет определить свой собственный маршрут до маршрута по умолчанию.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapMvcAttributeRoutes();

    routes.MapRoute(
        name: "IPA", 
        url: "IPA", 
        defaults: new { controller = "Account", action = "Login", IsIPA = "true" });

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

Приведенная выше конфигурация направит http://myurl.com/IPA к контроллеру с именем Account и методу действия с именем Login и передаст дополнительный ключ маршрута IsIPA. Этот же URL-адрес будет создан для комбинации Контроллер / Действие / IsIPA, потому что он является первым, совпадающим в списке.

Обратите внимание, что исходный URL http://myurl.com/Account/Login/?IsIPA=true будет по-прежнему работать и по-прежнему направлять в то же место. Эта конфигурация просто добавляет дополнительный маршрут к этому ресурсу.

13
NightOwl888 3 Мар 2015 в 13:35

Не тестируя, думаю, вы этого хотите:

routes.MapRoute("IPA", "Account/Login/{IsIPA}", 
               new { controller = "Account", action = "Login", IsIPA = "true"});
0
Ray Suelzer 3 Мар 2015 в 05:12