Маршрутизация веб-форм ASP.NET 4.0

У меня есть существующий сайт, который я хотел бы преобразовать для использования маршрутизации, и после прочтения сообщение Скотта Гатри здесь, я создал рабочий образец, который работает для большинство обстоятельств. Однако, поскольку не все страницы на существующем сайте соответствуют определенному шаблону, мне нужно свериться с базой данных, чтобы определить, какой маршрут (страница назначения .aspx) использовать.

Например, большинство страниц такие:

http://www.mysite.com/people/person.html

Это нормально - я могу легко перенаправить их на страницу view_person.aspx из-за каталога 'people'.

Но некоторые страницы такие:

http://www.mysite.com/category_page.html http://www.mysite.com/product_page.html

Это требует проверки базы данных, чтобы увидеть, следует ли выполнять маршрутизацию на страницу view_category.aspx или страницу view_product.aspx. И здесь я застрял. Могу ли я создать IRouteHandler, который проверяет базу данных и возвращает маршрут? Или есть способ лучше? Единственный код, который я нашел такого рода, - это ответ на этот вопрос.

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


person Eyeball    schedule 09.05.2010    source источник


Ответы (3)


Если вы не против, то самым чистым решением будет:

http://www.mysite.com/pages/category_page.html

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

person Robert Harvey    schedule 09.05.2010
comment
Понятно, но в данной ситуации это не вариант. На сайте огромное количество обратных ссылок, и мы не хотим рисковать потерять трафик и прибыль. - person Eyeball; 09.05.2010

Ваш обработчик маршрута не проверяет базу данных. Он отправляет все запросы в сценарий обработчика .aspx. Это тот сценарий, который проверяет базу данных.

Мой маршрут регистрации выглядит так ...

    private static void RegisterRoutes()
    {
        Route currRoute = new Route("{resource}.axd/{*pathInfo}", 
                                    new StopRoutingHandler());
        RouteTable.Routes.Add( "IgnoreHandlers", currRoute);

        currRoute = new Route("{urlname}",
                            new EPCRouteHandler("~/Default.aspx"));
        currRoute.Defaults = new RouteValueDictionary {{"urlname", "index.html"}};
        RouteTable.Routes.Add( "Default", currRoute);
    }

Пользовательский обработчик, который не требуется в ASP.Net 4.0, просто передает параметр urlname в отвечающий сценарий как переменную URL.

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

person kervin    schedule 17.05.2010

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

person Eyeball    schedule 18.05.2010