Контентно-зависимое сопоставление маршрутов в ASP.NET MVC 2 - PullRequest
1 голос
/ 29 июля 2010

Я работаю с ASP.NET MVC 2 и хотел бы оптимизировать мою маршрутизацию.Желаемый результат выглядит следующим образом:

http://www.url.com/Sites/
http://www.url.com/Sites/Search/NY001
http://www.url.com/Sites/NY001
http://www.url.com/Sites/NY001/Photos

Проблема этого сценария заключается в том, что я хочу по-разному относиться к битам URL в зависимости от их содержимого.Как можно себе представить, «NY001» - это идентификатор для конкретного сайта , а не для действия, которое живет в Sites контроллере.Мое текущее решение состоит в том, чтобы определить специальную карту маршрутов для URL-адресов, специфичных для сайта, и указать каждое действие в контроллере Sites отдельно перед этим.

// currently in place, works
routes.MapRoute("SiteList", "Sites", new { controller = "Sites", action = "Index" });
routes.MapRoute("SiteSearch", "Sites/Search/{searchString}", new { controller = "Sites", action = "Index", searchString = "" });
routes.MapRoute("SiteNotFound", "Sites/NotFound", new { controller = "Sites", action = "NotFound" });
// and so on...

routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index", siteId = "" });

Поскольку это один из центральных компонентов моего веб-приложения, эти действия растут ежедневно, и список становится немного громоздким.Я хотел бы иметь возможность вывести длинный список маршрутов, специфичных для действий, к одному объявлению, подобному следующему:

routes.MapRoute("Sites", "Sites/{action}/{id}", new { controller = "Sites", action = "Index", id = UrlParameter.Optional });

Проблема состоит в том, что структура маршрутизации не может различить этот новый маршрути сайт-специфичный в приведенном выше примере;следовательно, оба совпадения.Я застрял с объявлением каждого действия отдельно?Стоит ли подумать об использовании регулярного выражения для дифференциации на основе содержимого URL-адресов?

Заранее спасибо, и заранее прошу прощения, если этот вопрос уже задавался в другой форме.

1 Ответ

1 голос
/ 29 июля 2010

Не уверен, что именно вы хотите достичь. Конечно, вы не можете сопоставить URL-адреса с разными сигнатурами одним маршрутом, но вы можете уменьшить список следующим образом:

routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index" }, new { action = "(?:Index|Photos|News)", siteId = @"[A-Z0-9]+" });

для URL:

http://www.url.com/Sites/NY001
http://www.url.com/Sites/NY001/Photos
http://www.url.com/Sites/NY001/News

Этот маршрут будет отображаться только на действия «Индекс», «Фотографии», «Новости» (и все, что вы добавите в это выражение).

...