我的场景如下:一个地点可以是多个类别的一部分,用户也可以在多个类别类型上添加过滤器,所以我的URL现在如下所示:
/venues/beaches/boats/themeparks (这里将展示海滩、船只和主题公园的所有场馆)/venues/beaches/boats/venues等。因此,不同的场馆类型(海滩、船只、主题公园等)的数量是动态的,也是可选的。我决定使用URLRouting,这样我就可以通过Request.GetFriendlyUrlSegments()获得代码背后的不同值。
我安装了https://www.nuget.org/packages/Microsoft.AspNet.FriendlyUrls.Core/并在App_Start文件夹中手动创建了一个RouteConfig.vb文件。该文件包含:
Public NotInheritable Class RouteConfig
Private Sub New()
End Sub
Public Shared Sub RegisterRoutes(routes As RouteCollection)
Dim settings = New FriendlyUrlSettings()
settings.AutoRedirectMode = RedirectMode.Permanent
routes.EnableFriendlyUrls(settings)
routes.MapPageRoute("", "venues", "~/venues.aspx")
End Sub
End Class在global.aspx.vb中,我补充道:
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
RouteConfig.RegisterRoutes(RouteTable.Routes)
End Sub我从我的应用程序中删除了所有重写规则,所以在web.config或rewriteRules.config中没有规则。当我转到URL:www.example.com/venues时,它正确地将我重定向到venues.aspx。但是这个URL:www.example.com/venues/boats/outside/castles/barns/restaurants抛出一个404错误:

我还检查了这里并尝试了这一点,以便在Windows上启用http重定向并更改web.config:
web.config
<!-- tried setting mode to On/Off/Custom -->
<customErrors mode="Off" defaultRedirect="/error/1" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="/404.aspx" />
</customErrors>
<modules runAllManagedModulesForAllRequests="true">
<add type="aspnetforum.ForumSEOHttpModule, aspnetforum" name="ForumSEOHttpModule" />
<remove name="UrlRoutingModule"/>
<add name="UrlRoutingModule"
type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
<handlers>
<remove name="PHP55_via_FastCGI" />
<remove name="PHP53_via_FastCGI" />
<add name="ScriptCombiner" verb="POST,GET" path="ScriptCombiner.axd" preCondition="integratedMode" type="ScriptCombiner, App_Code" />
<add name="UrlRoutingHandler"
preCondition="integratedMode"
verb="*"
path="UrlRouting.axd"
type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</handlers>我发现,当我在RouteConfig.vb中显式定义路由时,它确实可以工作,如下所示:
routes.MapPageRoute("", "venues", "~/venues.aspx")
routes.MapPageRoute("", "venues/boats/outside/castles/barns/restaurants", "~/venues.aspx")所以现在URL /venues和/venues/boats/outside/castles/barns/restaurants起作用了,但这根本不是动态的。由于有很多场地类别和组合,我不想添加所有这些组合手动。我只想在以/venues开头的所有URL上匹配,然后在venues.aspx.vb中使用Request.GetFriendlyUrlSegments方法获得场地类别。
我该怎么做?
发布于 2015-12-07 16:00:01
我相信您需要将URL模式添加到您的routes.MapPageRoute调用中。
URL模式可以包含文字值和可变占位符(称为URL参数)。文字和占位符位于URL的段中,这些段由斜杠(/)字符分隔。
在发出请求时,将URL解析为段和占位符,并将变量值提供给请求处理程序。此过程类似于解析查询字符串中的数据并将其传递给请求处理程序的方式。在这两种情况下,变量信息都包含在URL中,并以键值对的形式传递给处理程序。对于查询字符串,键和值都在URL中。对于路由,键是在URL模式中定义的占位符名称,并且只有值在URL中。
在URL模式中,通过将占位符封装在大括号({和} )中来定义占位符。您可以在一个段中定义多个占位符,但它们必须由一个文字值分隔。例如,{language}-{country}/{action}是有效的路由模式。但是,{language}{country}/{action}不是有效的模式,因为占位符之间没有文字值或分隔符。因此,路由无法确定将语言占位符的值与国家占位符的值分隔到何处。
您可以使用几种不同的方法来限制您的路线。您可以使用RegEx,如下所示:
routes.MapRoute(name := "BlogPost", url := "blog/posts/{postId}", defaults := New With { _
Key .controller = "Posts", _
Key .action = "GetPost" _
}, New With { _
Key .postId = "\d+" _
})上面代码中的小正则表达式@"\d+基本上将这个路由的匹配限制为URL,其中postId参数包含一个或多个数字,换句话说,只需要整数。
使用路由约束的另一个选项是创建一个实现IRouteConstraint接口的类。
更多信息,来自CodeProject。
https://stackoverflow.com/questions/34080141
复制相似问题