Динамическая маршрутизация MVC 2.0 для имен категорий в интернет-магазине - PullRequest
6 голосов
/ 24 июля 2010

В настоящее время я работаю в интернет-магазине с использованием ASP.NET MVC 2.0.Я уже получил большую часть этого и работает, но часть, которая беспокоит меня, является маршрутизацией.Я хочу это:

http://mystore.somewhere/my-category-1/

До сих пор я был в состоянии решить это с помощью:

routes.MapRoute(
            "Category",
            "{alias}/{pageNumber}",
            new { controller = "Categories", action = "Browse", pageNumber = 1 });

Но это ловит слишком много, чем простоМне бы хотелось.

Прочитав некоторые вопросы и ответы по этому сайту, я нашел особенно интересное решение, которое потребовало бы от меня программной регистрации маршрута для каждой из моих категорий, поэтому, по сути, я бы делал

 foreach (var c in Categories)
        {
            routes.MapRoute(
                c.Name,
                "{" + c.Alias + "}/{action}/...anything else",
                new { controller = "Category", action = "Index" }).RouteHandler = new CateegoryRouteHandler(c);
        }

Что ты думаешь?Это хорошая идея?Я, вероятно, собираюсь иметь около 200 категорий, это слишком много «маршрутов», чтобы иметь в таблице маршрутизации?Не могли бы вы предложить другое решение?

Спасибо.

С уважением, Анже

1 Ответ

5 голосов
/ 24 июля 2010

Один маршрут с динамическим ограничением может быть более элегантным решением. Просто установите ограничение, которое соответствует только вашим категориям.

     routes.MapRoute(
        "Category",
        "{alias}/{pageNumber}",
        new { controller = "Categories", action = "Browse", alias = UrlParameter.Optional, pageNumber = 1 },
        new { alias = new CategoryMatchConstraint() } );


 public class CategoryMatchConstraint : IRouteConstraint
 {
      public bool Match( HttpContextBase httpContext,
                         Route route,
                         string parameterName,
                         RouteValueDictionary values,
                         RouteDirection routeDirection )
      {
           var category = values.Values[parameterName] as string;
           if (string.IsNullOrEmpty(category))
           {
                return false;
           }
           using (var db = new MyDatabaseContext())
           {
                return db.Categories.Any( c => c.Name == category );
           }
      }
}
...