asp.Net MVC 3 Маршрутизация на основе количества сегментов - PullRequest
0 голосов
/ 02 ноября 2011

Я понимаю концепцию определения и выполнения маршрутизации в определенном порядке, но у меня определены следующие маршруты:

routes.MapRoute(
            "Image",                                        
            "Image/{action}/{width}/{height}/{file}",       
            new { controller = "Image", action = "Thumbnail", width = 250, height = 250 }
        );

routes.MapRoute(
           "GetCampaignsByCampaignType",
           "Endorsement/GetCampaignsByCampaignType/{campaignType}",
           new { controller = "Endorsement", action = "GetCampaignsByCampaignType" }
        );

routes.MapRoute(
            "Help",
            "Help",
            new { controller = "Help", action = "Contact" } 
        );

routes.MapRoute(
            "Campaigns",
            "Campaigns",
            new { controller = "Endorsement", action = "Campaigns" } 
        );

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
        );

routes.MapRoute(
            "Campaign",
            "{campaignUrlName}",
            new { controller = "Endorsement", action = "GetCampaign" }
        );

Вопрос касается двух нижних маршрутов. У меня есть такие кампании, как / Summer, / Winter, / Some-other-name, где у меня их сотни, и я не хочу их жестко кодировать. У меня также есть другие маршруты, на которые я хочу попасть, например / Campaign / Account, / Справка / Мне / Пожалуйста (если имеется более одного сегмента / 1/2 или / 1/2/3)

Каков правильный порядок или определение, чтобы я мог / 1 перейти к последнему определенному выше маршруту, а / 1/2 или / 1/2/3 перейти по умолчанию {controller} / {action} / {id}

В настоящее время в обоих сценариях используется маршрут по умолчанию {controller} / {action} / {id}, включая / 1. Если я переверну их, то / 1 будет работать, но / 1/2 или / 1/2/3 не перейдут к маршрутизации по умолчанию.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Нашел решение с помощью регулярного выражения:

 routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", id = UrlParameter.Optional },
            new { action = @"\w*" }
        );

        routes.MapRoute(
            "Campaign",
            "{campaignUrlName}",
            new { controller = "Endorsement", action = "GetCampaign" },
            new { campaignUrlName = @"^([a-zA-Z])[a-zA-Z_-]*[\w_-]*[\S]$|^([a-zA-Z])[0-9_-]*[\S]$|^[a-zA-Z]*[\S]$" }
        );

Таким образом, требуется действие, которое по умолчанию имеет два сегмента / 1/2 (идеально) и никогда не перехватывает ни одного URL-адреса сегмента, а последний маршрут попадает после него.пропускает все остальные и просто проверяет, содержит ли он правильные символы.

0 голосов
/ 02 ноября 2011

Ваш маршрут по умолчанию всегда будет переопределять маршрут вашей кампании, потому что существуют настройки по умолчанию для контроллера и метода.Поэтому / Winter будет интерпретироваться как «WinterController» (который не существует) с Индексом по умолчанию (который также не существует), поэтому вы получите 404.

Вам нужно будет определить конкретные маршрутыдля / Зима и / Лето и т. д. и поместите их до значения по умолчанию.

...