Проблема маршрутизации ASPNET MVC - PullRequest
2 голосов
/ 02 декабря 2011

Мне нужно добавить http://mysite/categoryname маршрут, поэтому я добавил

routes.MapRoute(
     "Categories",
     "{CategoryName}",
     new { controller = "News", action = "Category", CategoryName = "" },
     new string[] { "MyProj.Controllers" }
        );

Проблема в том, что если я добавлю его раньше

routes.MapRoute(
     "Default", // Route name
     "{controller}/{action}/{id}", // URL with parameters
     new { controller = "News", action = "Index", id = UrlParameter.Optional }, 
     new string[] { "MyProj.Controllers" }
        );

Домашняя страница идет по ошибке, потому что она входит в маршрут Категории; если я добавлю маршрут категорий в последнюю позицию, он никогда не будет введен, и http://mysite/category_name даст мне 404.

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

У вас есть несколько вариантов здесь:

Измените маршрут категории новостей, включив в него жесткий путь:

routes.MapRoute(
     "Categories",
     "category/{CategoryName}",
     new { controller = "News", action = "Category", CategoryName = "" },
     new string[] { "MyProj.Controllers" }
        );

Измените маршрут по умолчанию, чтобы включить жесткий путь:

routes.MapRoute(
     "Default", // Route name
     "site/{controller}/{action}/{id}", // URL with parameters
     new { controller = "News", action = "Index", id = UrlParameter.Optional }, 
     new string[] { "MyProj.Controllers" }
     );

Сверните свой собственный класс маршрутизации

См. http://hanssens.org/post/ASPNET-MVC-Subdomain-Routing.aspx для несвязанного примера.

1 голос
/ 27 января 2012

Независимо от того, как вы это делаете, когда вы добавляете категории, вы, очевидно, рискуете перейти на другие страницы сайта - например, если у вас есть раздел вашего сайта с именем / account, а затем кто-то создает категориюс именем "account", что должно произойти?

Тем не менее, есть более простой ответ, чем написание собственного класса Routing.Вы можете использовать Regex в категории Route и сделать его первым правилом.Например, если только 2 категории на сайте были куртками и свитерами:

routes.MapRoute(
    "Categories",
    "{CategoryName}",
    new { controller = "News", action = "Category" },
    new { CategoryName = "(jackets|sweaters)" }
);

Последний аргумент - это RouteConstraint, основанный на Regex, и поэтому маршрут будет зависеть от маршрутов, включенных после него, если путьни / jackets, ни /sweaters.

Очевидно, что вы хотите быть более надёжным, поэтому вы можете создать метод для построения Regex при запуске приложения:

routes.MapRoute(
    "Categories",
    "{CategoryName}",
    new { controller = "News", action = "Category" },
    new { CategoryName = "(" + String.Join("|", categories) + ")" }
);

categories здесьдолжно быть что-то, что вы предоставляете - какой-то массив или фид базы данных имен категорий в вашем приложении.

...