2016-02-17 3 views
0

У меня есть сайт MVC Asp.Net с базой данных MS SQL. На этом сайте есть панель администрирования, где, помимо других вещей, администратор может изменить меню сайта.ASP.MVC настраиваемая маршрутизация из базы данных

Что мы хотим сделать, так это позволить владельцу сайта динамически изменять не только имена меню, но и маршруты страниц, чтобы они могли выбирать URL-адрес любой страницы сайта.

Представьте себе, что у нас есть разные страницы (просмотр), как видео, новости, фотографии ... маршруты по умолчанию (URL) для тех, кто зрения может быть:

www.site.com/videos 
www.site.com/news 
www.site.com/photos 

Администратор должен иметь возможность динамически изменять те маршруты сын, когда пользователь попал на страницу новостей он показывает URL, что они хотят, например:

www.site.com/my-videos 
www.site.com/latest-news 
www.site.com/photo-gallery 

идея загружающего меню сайта из БД, получая название меню, контроллер, действие и маршрут страницы. И оттуда мы должны вызвать контроллер и действие, чтобы загрузить представление, но нам нужно показать в URL-адресе маршрут, который администратор установил для этого представления.

Также возможно, что у нас есть несколько действий (видов) в одном контроллере. Например, новости и видео находятся в одном контроллере.

Если мы передадим параметр «customRoute» в Route.Config, это дает нам ошибку, потому что имя этого параметра одинаково для этих действий в том же контроллере.

Как мы можем это сделать с помощью маршрутизации ASP.NET?

Заранее спасибо.

ответ

0

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

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

     var redirects = LegacyRedirectRepo.GetRedirects(); 
     foreach (var legacyRedirect in redirects) 
     { 
      if (!legacyRedirect.Source.Contains("?")) 
      { 
       routes.Add(new LegacyRoute(legacyRedirect.Source, legacyRedirect.Destination)); 
      } 
     } 

     routes.IgnoreRoute("{folder}/{*pathInfo}", new { folder = "upload" }); 
     routes.IgnoreRoute("{folder}/{*pathInfo}", new { folder = "content" }); 

     routes.IgnoreRoute(
      "{*staticfile}", 
      new { staticfile = @".*\.(jpg|gif|jpeg|png|js|css|htm|html)$" } 
     ); 
//static routing rules 
} 

Или вы можете переопределить BeginProcessRequest что-то вроде этого

public class LegacyHandler : MvcHandler 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="LegacyHandler"/> class. 
    /// </summary> 
    /// <param name="requestContext">The request context.</param> 
    public LegacyHandler(RequestContext requestContext) 
     : base(requestContext) 
    { 
    } 

    /// <summary> 
    /// Called by ASP.NET to begin asynchronous request processing. 
    /// </summary> 
    /// <param name="httpContext">The HTTP context.</param> 
    /// <param name="callback">The asynchronous callback method.</param> 
    /// <param name="state">The state of the asynchronous object.</param> 
    /// <returns>The status of the asynchronous call.</returns> 
    protected override System.IAsyncResult BeginProcessRequest(HttpContext httpContext, System.AsyncCallback callback, object state) 
    { 
     var legacyRoute = RequestContext.RouteData.Route as LegacyRoute; 

     httpContext.Response.Status = "301 Moved Permanently"; 
     var urlBase = RequestContext.HttpContext.Request.Url.GetLeftPart(System.UriPartial.Authority); 

     var url = string.Format("{0}/{1}", urlBase, legacyRoute.Target); 
     if (!string.IsNullOrWhiteSpace(RequestContext.HttpContext.Request.Url.Query)) 
     { 
      var pathAndQuery = RequestContext.HttpContext.Request.Url.PathAndQuery; 
      pathAndQuery = pathAndQuery.Substring(1, pathAndQuery.Length - 1); 
      var redirect = LegacyRedirectRepo.GetRedirect(pathAndQuery); 

      url = string.Format(@"{0}/{1}", urlBase, redirect.Destination); 

     } 

     httpContext.Response.RedirectPermanent(url); 
     httpContext.Response.End(); 

     return null; 
    } 
} 
Смежные вопросы