URL-маршрутизация с поиском в базе данных? - PullRequest
3 голосов
/ 27 мая 2009

Я хочу создать сайт ASP.NET MVC, чтобы контроллер для определенного URL-адреса сохранялся в базе данных вместо URL-адреса.

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

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

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

Ответы [ 4 ]

4 голосов
/ 27 мая 2009

В основном вам придется реализовать свой собственный IRouteHandler.

Часть ответа и пример кода приведены в Варианте 3 ответа на этот вопрос: ASP.NET MVC настраиваемая маршрутизация для поиска

Дополнительная информация: http://weblogs.asp.net/fredriknormen/archive/2007/11/18/asp-net-mvc-framework-create-your-own-iroutehandler.aspx

1 голос
/ 27 мая 2009

Почему ты не мог просто сделать что-то вроде этого:

- Global.asax.cs -

 routes.MapRoute(null,              // Route name
                 "content/{id}",    // URL with parameters               
                 new { Controller = "Content", Action = "Show", Id = (string) null });  // Parameter defaults

- /Controllers/ContentController.cs -

public class ContentController : Controller
{
    public ActionResult Show(string id)
    {
        // Lookup the 'content' (article, page, blog post, etc) in the repository (database, xml file, etc)
        ContentRepository repository = new ContentRepository();
        Content content = repository.FindContent(id);
        return View(content);
    }
}

Так, чтобы запрос на ваш сайт www.yoursite.com/content/welcome-to-my-first-blog-post вызвал ContentController.Show ("welcome-to-my-first-blog-post")

0 голосов
/ 27 мая 2009

"для системы с 100 000 страниц это кажется плохой идеей."

Это плохая идея, если вы создаете систему маршрутизации, которую нельзя использовать повторно. Базовая схема {controller} / {action} / {id} указывает вам направление повторного использования. Эта схема может быть расширена / обновлена ​​/ воссоздана в соответствии с вашими потребностями.

Вместо того, чтобы думать о том, сколько страниц у вас есть, о том, как ваши ресурсы могут быть сгруппированы.

Вместо создания сложной системы маршрутизации, почему бы не создать элемент управления якорной ссылки (ascx), который позволяет пользователю добавлять только допустимые внутренние ссылки. Держите таблицу в БД ваших шаблонов и их контроллеров, чтобы заполнить ею элемент управления.

0 голосов
/ 27 мая 2009

Я полагаю, что ASP.NET может делать то же самое, что и PHP. Если так, то есть простой подход.

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

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