2010-01-27 2 views
1

Я ищу для создания сайта MVC, который имеет полный контроль над структурой URL, используя маршрутизацию.mvc.net dynamic urls

 routes.MapRoute(
      "BlogView",              // Route name 
      "view/{blogurl}",             // URL with parameters 
      new { controller = "view", action = "view", productLink = ""} // Parameter defaults 
     ); 

     routes.MapRoute(
      "ProductGrid",              // Route name 
      "category/{category}",             // URL with parameters 
      new { controller = "category", action = "Index", category = "" } // Parameter defaults 
     ); 

я в настоящее время происходит некорректно URLs;

www.myblog.com/view/first-post

www.myblog.com/view/another-post

www.myblog.com/category/code

www.myblog .com/category/example

Первые два URL-адреса относятся к подробному представлению, причем последние два относятся к категории.

У меня есть база данных со следующей структурой; Я гарантирую, что URL (chrUrl) является уникальным ключом. URL (idurl (INT), chrURL, chrAction, chrController )

Мой план состоит в том, что можно посмотреть переписать таблицу маршрутов подстановок, так что происходит некорректно URLs перенаправление на правильный вид и страницы в сайт;

www.myblog.com/first-post

www.myblog.com/another-post

www.myblog.com/code

www.myblog.com/example

Возможно ли это? Отверженность в стороне, есть ли проблема с этим и как shoudl я об этом?

ответ

1

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

routes.MapRoute(
      "Root", // Route name 
      "/{id}", // URL with parameters 
      new { controller = "default", action = "redirect"} // Parameter defaults 
     ); 

Но если вы можете жить с наличием «/ категории /» в вашей категории URLs, что будет более элегантным решением на заднем конце.

1

Прежде всего, я бы предложил придумать схему URL, которой вы довольны. (кажется, у вас его уже нет)

Тогда я бы использовал ControllerFactory, который будет отвечать за создание и , управляя правильным действием на правый контроллер. Это не зависит от каких-либо маршрутов, которые вы определяете в своей таблице маршрутов - на самом деле это не имеет значения, что у вас есть, поскольку вы хотите, чтобы ваш URL был «управляемым базой данных». Вы вызовите контроллер завода из файла Global.asax:

protected void Application_Start() 
{ 
    RegisterRoutes(RouteTable.Routes); 
    ControllerBuilder.Current.SetControllerFactory(new Controllers.ControllerFactory()); 
} 

Затем в методе GetControllerType в вашем ControllerFactory, вы осмотрите URL с

RequestContext.RouteData.Values.ContainsKey("keyname") 

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

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

В то время как вы хотите, чтобы вы сделали вещи более элегантными, создайте базовый контроллер, на который наследуются ваши контроллеры, и там задайте вещи в своих ViewData, таких как ваши теги SEO (MetaDescription, Title и т. Д.) - посмотрите это из вашей базы данных.

+0

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

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