ASP.net Routing - использование запросов к базе данных для определения физического файла и добавления дополнительных данных о маршруте из результатов запроса - PullRequest
0 голосов
/ 24 февраля 2012

Мой вопрос касается маршрутизации страниц на веб-формах ASP.net (VB).

Мне нужно перенаправить на 2 .aspx страницы несколькими способами, например,

routes.MapPageRoute("SEO", "{Title}/{Id}", "~/PageA.aspx")
routes.MapPageRoute("Catalogue", "Issue{IssueNumber}-{PageNumber}", "~/PageA.aspx")

но мне нужно реализовать некоторую логику, включающую запросы к базе данных (LINQ to SQL) на обоих маршрутах, например

Маршрут 1) Проверьте битовое поле, если false, то физический файл = PageA.aspx, true тогда PageB.aspx

Маршрут 2) Поиск IssueNumber и PageNumber, получение PageId и добавление в RouteData, установка физического файла = PageA.aspx

Я думаю, что лучший способ сделать это - реализовать класс IRouteHandler, но я не смог определить:

  • Куда писать запросы к базе данных в таком классе
  • Как установить физический файл в классе
  • Где / как добавить новое значение к данным маршрута, т.е. PageId
  • Где проверить, что поля Id и Number на самом деле являются целыми числами (ограничениями?)

Не могу найти какую-либо полезную документацию VB.net, какие-либо предложения?

Если нет, мне придется прибегнуть к промежуточной странице .aspx, т.е. Transfer.aspx, а затем выполнить запросы к базе данных, а затем сохранить возвращаемые значения в переменных сеанса и затем выполнить Server.Transfer(PageA.aspx), но это похоже старомодный и не элегантный способ сделать это. Пожалуйста помоги!

1 Ответ

1 голос
/ 24 февраля 2012

Вместо написания своего собственного IRouteHandler я бы предложил реализовать ваш класс Route.Переопределите GetRouteData и настройте объект RouteData, который вы возвращаете в соответствии с вашими потребностями.

Где писать запросы к базе данных в таком классе

Как упоминалось выше, GetRouteData - это то место, которое вы ищете.

Как установить физический файл в классе

В возвращаемом объекте RouteData установите RouteHandler новый экземпляр PageRouteHandler.Вы можете передать физический путь в конструктор PageRouteHandler.

Где / как добавить новое значение к данным маршрута, т.е. PageId

Использовать свойство Values ​​объекта RouteData.

Где проверить, что поля Id и Number на самом деле являются целыми числами (ограничениями?)

Это должно быть сделано с ограничениями маршрута.Например, шестым параметром MapPageRoute является RouteValueDictionary с ограничениями.Чтобы просто проверить, что параметр является целым числом, используйте регулярное выражение, например, так:

routes.MapPageRoute("RouteName", _
  "product/{id}", "~/Products.aspx", _
  True, New RouteValueDictionary(), _
  New RouteValueDictionary() From { {"id", "\d+"} })

Смотрите "\ d +" в конце?Это регулярное выражение, которому должен соответствовать параметр id.

Если вам нужны более сложные ограничения, вы также можете это сделать, см., Например, http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx

...