2015-03-30 6 views
1

Я создаю сокращенную версию CMS с использованием MVC 5, и я пытаюсь пройти через сторону маршрутизации.MVC-маршрутизация для страниц CMS

Мне нужно обрабатывать страницы с URL-адресами, такими как /how-it-works/ и /about-us/ и т. Д., И поэтому контент указан на этих путях.

В моем RouteConfig файле я использую маршрут «поймать всех» следующим образом ::

routes.MapRoute("Static page", "{*path}", new { controller = "Content", action = "StaticPage" }); 

Это успешно ударяет действие контроллера я ищу, однако таким образом это означает, что запросы на действия контроллера, что на самом деле действительно есть (например /navigation/main также отправляю по этому маршруту).

Я знаю, что у меня есть маршрут, который соответствует /navigation/main, но я бы предпочел настроить MVC для этого как по умолчанию, как если бы я не добавлял правило, которое у меня выше, какие-либо идеи?

+0

Добавьте маршрут, ограничивающий маршрут «поймать все» для {* path}. И в route.config поместите «По умолчанию» маршрут MVC внизу. – tmg

+0

Не могли бы вы объяснить ниже? – lisburnite

+0

Возможный дубликат [Динамические маршруты из базы данных для ASP.NET MVC CMS] (http://stackoverflow.com/questions/16026441/dynamic-routes-from-database-for-asp-net-mvc-cms) – hacker

ответ

1

Добавить «поймать всех» маршрут на вершине маршрута «по умолчанию» и добавьте route constrain в путь:

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


      routes.MapRoute(
       "Static page", 
       "{*path}", 
       new { controller = "Content", action = "StaticPage" } 
       new { path = new PathConstraint() }); 

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

PathConstraint следует извлечь из из IRouteConstraint интерфейса и может быть что-то вроде этого:

public class PathConstraint: IRouteConstraint 
{   

     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
     { 
      if (values[parameterName] != null) 
      { 
       var permalink = values[parameterName].ToString(); 
       //gather all possible paths from database 
       //and check if permalink is any of them 
       //return true or false 
       return database.GetPAths().Any(p => p == permalink); 
      } 
      return false; 
     } 
    } 

Так что, если «путь» не является одним из путей ваших страниц, PathConstrain не будет удовлетворен, а маршрут «Статическая страница» будет пропущен и перейдет к следующему маршруту.

Смежные вопросы