首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET路由:如何使routeConfig处理更动态的routeConfig结构

ASP.NET路由:如何使routeConfig处理更动态的routeConfig结构
EN

Stack Overflow用户
提问于 2015-12-04 02:55:38
回答 1查看 3K关注 0票数 3

我的场景如下:一个地点可以是多个类别的一部分,用户也可以在多个类别类型上添加过滤器,所以我的URL现在如下所示:

  1. /venues/beaches/boats/themeparks (这里将展示海滩、船只和主题公园的所有场馆)
  2. /venues/beaches/boats
  3. /venues等。

因此,不同的场馆类型(海滩、船只、主题公园等)的数量是动态的,也是可选的。我决定使用URLRouting,这样我就可以通过Request.GetFriendlyUrlSegments()获得代码背后的不同值。

我安装了https://www.nuget.org/packages/Microsoft.AspNet.FriendlyUrls.Core/并在App_Start文件夹中手动创建了一个RouteConfig.vb文件。该文件包含:

代码语言:javascript
复制
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中,我补充道:

代码语言:javascript
复制
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    RouteConfig.RegisterRoutes(RouteTable.Routes)
End Sub

我从我的应用程序中删除了所有重写规则,所以在web.configrewriteRules.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

代码语言:javascript
复制
<!-- 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中显式定义路由时,它确实可以工作,如下所示:

代码语言:javascript
复制
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方法获得场地类别。

我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,如下所示:

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34080141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档