динамические URL-адреса mvc.net - PullRequest
1 голос
/ 28 января 2010

Я хочу создать сайт MVC, который полностью контролирует структуру URL с помощью маршрутизации.

</p> <pre><code> 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 );

У меня сейчас есть следующие URL;

www.myblog.com / просмотр / запись первого

www.myblog.com / вид / другое-сообщение * * 1013

www.myblog.com / категория / код

www.myblog.com / категория / пример

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

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

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

www.myblog.com / первый пост

www.myblog.com / другой столб

www.myblog.com / код

www.myblog.com / пример

Возможно ли это? Помимо производительности, есть ли проблема с этим и как я могу пойти по этому поводу?

Ответы [ 2 ]

1 голос
/ 28 января 2010

Прежде всего, я бы предложил придумать схему 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 - база данных содержала схемы URL, контроллер и представления для визуализации на этом контроллере.

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

1 голос
/ 28 января 2010

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

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

Но если вы можете жить с наличием "/ category /" в URL-адресах вашей категории, это будет более изящное решение для серверной части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...