ASP.net路由-使用数据库查询来确定物理文件,并从查询结果中添加额外的路由数据

ASP.net路由-使用数据库查询来确定物理文件,并从查询结果中添加额外的路由数据,asp.net,linq-to-sql,webforms,asp.net-mvc-routing,asp.net-routing,Asp.net,Linq To Sql,Webforms,Asp.net Mvc Routing,Asp.net Routing,我的问题是关于ASP.net(VB)Web表单网站中的页面路由 我需要以多种方式路由到2.aspx页面,例如 routes.MapPageRoute("SEO", "{Title}/{Id}", "~/PageA.aspx") routes.MapPageRoute("Catalogue", "Issue{IssueNumber}-{PageNumber}", "~/PageA.aspx") 但我需要在这两条路径上实现一些涉及数据库查询(LINQ到SQL)的逻辑,例如 路由1)检查位字段,如果

我的问题是关于ASP.net(VB)Web表单网站中的页面路由

我需要以多种方式路由到2.aspx页面,例如

routes.MapPageRoute("SEO", "{Title}/{Id}", "~/PageA.aspx")
routes.MapPageRoute("Catalogue", "Issue{IssueNumber}-{PageNumber}", "~/PageA.aspx")
但我需要在这两条路径上实现一些涉及数据库查询(LINQ到SQL)的逻辑,例如

路由1)检查位字段,如果为false,则物理文件=PageA.aspx,如果为true,则为PageB.aspx

路由2)查找IssueNumber和PageNumber,检索PageId并添加到RouteData,设置物理文件=PageA.aspx

我认为最好的方法是实现IRoutHandler类,但我还不能确定:

  • 在此类中,在何处编写数据库查询
  • 如何在类中设置物理文件
  • 在何处/如何向路由数据(即PageId)添加新值
  • 在哪里检查Id和数字字段实际上是整数(约束?)
我找不到任何有用的VB.net文档,有什么建议吗


如果没有,我将不得不求助于中间.aspx页面,即Transfer.aspx,然后执行数据库查询,然后将返回值存储在会话变量中,然后执行
Server.Transfer(PageA.aspx)
,但这似乎是一种老式且不雅观的方式。请帮忙

我建议实现Route类,而不是编写自己的IRouteHandler。覆盖GetRouteData并设置根据需要返回的RouteData对象

在此类中,在何处编写数据库查询

如上所述,GetRouteData是您正在寻找的地方

如何在类中设置物理文件

在返回的RouteData对象上,将RouteHandler设置为新的PageRouteHandler实例。您可以将物理路径传递给PageRouteHandler的构造函数

在何处/如何向路由数据(即PageId)添加新值

使用RoutedData对象的“值”属性

在哪里检查Id和数字字段实际上是整数(约束?)

这应该通过管线约束来完成。例如,MapPageRoute的第六个参数是带有约束的RouteValueDictionary。要简单检查参数是否为整数,请使用正则表达式,如下所示:

routes.MapPageRoute("RouteName", _
  "product/{id}", "~/Products.aspx", _
  True, New RouteValueDictionary(), _
  New RouteValueDictionary() From { {"id", "\d+"} })
看到结尾的“\d+”了吗?这是id参数需要匹配的正则表达式


如果您需要更复杂的约束,您也可以这样做,请参见例如

谢谢,我从来没有这样想过。所以我需要做的就是通过继承实现我自己的路由类?然后覆盖相关成员?这是否意味着每次用户访问另一个页面时都会创建路由对象?路由对象仅添加到RouteCollection一次(通常在应用程序启动期间),但对于每个请求,都会创建一个RoutedData对象。我认为问题在于RoutedData不允许您设置只读的值。我曾考虑将PageId存储在DataToken中,但我非常确定,因为路由对象是在应用程序启动期间设置的,所以它们不会在页面之间更改。您不能设置Values属性,这是事实。但是你可以修改它的内容,比如routeData.Values.Add(“PageId”,myPageId)等等。正如我所说的,Route对象不会改变,但是你创建的routeData对象对于每个请求都是新的。