2015-11-26 38 views
2

我的情况如下:场地可以是多个类别的用户也可以在多个类别类型添加过滤器的一部分,所以我的网址,现在是这样的:处理在IIS重写规则的可选URL参数的动态数

  1. /venues/beaches/boats/themeparks (这将显示有海滩和船只和themeparks所有场馆)
  2. /venues/beaches/boats
  3. /venues

因此,不同场地类型(海滩,船只,主题公园等)的数量既是动态的,也是可选的。我怎样才能设置我的重写规则:category查询字符串参数保存所有不同的场地类型,或者最好是category参数多次添加,如果没有提供venuetype,那么category只会为空/空?

所以对于网址:/venues/beaches/boats/themeparks

我会得到这个重写URL:search.aspx?category=beaches&category=boats&category=themeparks

而对于网址:/venues

我会得到这个重写URL:search.aspx?category=(或太细会:search.aspx

我现在只有这个:

<rule name="venue types"> 
    <match url="^venues/([a-zA-Z0-9-+']+)$"/> 
    <action type="Rewrite" url="search.aspx?category={R:1}"/> 
</rule> 

更新

我去@Arindam纳亚克的以下建议。

我安装了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("", "test", "~/contact.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 

当我去www.example.com/test,它现在可以正确地重定向我contact.aspx。 (注意:URL重写 - 在web.configrewriteRules.config文件,以便规则 - 优先于RouteConfig.vb

我几乎没有,所以这www.example.com/test正确重定向到文件contact.aspx 但这www.example.com/test/boats/outside/more/fields/are/here,抛出一个404错误:

enter image description here

更新2

我添加记录到routeConfig.vb

GlobalFunctions.Log("1") 
    Dim settings = New FriendlyUrlSettings() 
    GlobalFunctions.Log("2") 
    settings.AutoRedirectMode = RedirectMode.Permanent 
    GlobalFunctions.Log("3") 
    routes.EnableFriendlyUrls(settings) 
    GlobalFunctions.Log("4") 
    routes.MapPageRoute("", "test", "~/contact.aspx") 
    GlobalFunctions.Log("5") 

而这些行全部被执行。现在发生了一些奇怪的事情: routeConfig.vb似乎只能执行一次。所以:

  1. 我构建我的应用程序。
  2. 我转到/test URL
  3. 该行被记录和我的contact.aspx页面
  4. 我刷新/测试页,NO行被记录

而且我也试过到:

  1. 我构建我的应用程序。
  2. 我转到/test/boats/outside/more/fields/are/here URL
  3. 该行被记录
  4. 我收到上述404错误
  5. 我刷新页面,没有什么再登录

如此看来routeConfig只会被击中一次(在applicationstart?上),然后再也没有命中。而对于要求/test/boats/outside/more/fields/are/here它到达routeConfig.vb文件,但不显示contact.aspx出于某种原因...

更新3

我发现,当我明确定义的路由,它的工作,像所以:

routes.MapPageRoute("", "test", "~/contact.aspx") 
routes.MapPageRoute("", "test/123", "~/contact.aspx") 

所以现在URL /test/test/123工作,但不是动态的所有,我只是想匹配/test然后获取FriendlyUrlSegments。

我不能发布的代码在网上,所以,如果有帮助,这是我的解决方案资源管理器: enter image description here

我能做些什么?

+0

你可以关注我的博客 - https://arindamnayak1.wordpress.com/2015/03/07/seo-friendly-url-routing-in-asp-net/,你可以使用'Request.GetFriendlyURLSegments' ,它会返回你的数组值,即'场所/ X/Y/Z'将会是'[x,y,z]',如果你需要更多的细节,我可以把它作为答案。 –

+0

@ArindamNayak谢谢。是的,回答SO的建议方式总是要回答SO本身(外部网站可能会在未来取消)。所以是的,我很想在这里得到您的答案,并将其应用于我的场景:)再次感谢! – Flo

+0

我已经发布我的建议作为答案。 –

回答

1

要有这样的SEO友好的URL,你需要安装“Microsoft.AspNet.FriendlyUrls”nuget包。

打开包管理器控制台 - Help。然后键入以下 -

Install-Package Microsoft.AspNet.FriendlyUrls

然后,它会自动添加在RouteConfig.cs以下。

public static class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     var settings = new FriendlyUrlSettings(); 
     settings.AutoRedirectMode = RedirectMode.Permanent; 
     routes.EnableFriendlyUrls(settings); 
    } 
} 

对于你的情况下,你需要添加以下内容RouteConfig.cs

routes.MapPageRoute("", "venues", "~/venues.aspx");

所以,当你打网址http://www.example.com/venues/beaches/boats/themeparkshttp://www.example.com/venues/beaches,它会打venues.aspx。在venues.aspx.cspage_load事件你需要有以下代码。

IList<String> str = Request.GetFriendlyUrlSegments();

对于案例1,STR将是['beaches','boats','themeparks']和情形2中这将是['beaches']

欲了解更多信息,你可以参考my blog或相似的,所以在这里回答 - Reroute query string using friendlyUrl

让我知道,如果你面对的任何问题或仍您的问题没有得到解决。

+0

我正在通过Visual Studio中的NuGet包管理器,看到'Microsoft.AspNet.FriendlyUrls',还有'Microsoft.AspNet.FriendlyUrls.Core',后者的描述似乎与我的需求更匹配。我需要哪一个?而我正在使用VB.NET,并没有RouteConfig文件呢......这有什么关系吗? – Flo

+0

我会建议去'Microsoft.AspNet.FriendlyUrls',如果失败了,那就去第二个吧。你可以选择一个简单的基于MVC的项目(一个侧面项目),如果这个项目在那里工作,那么拿走这些组件并使它与现有的组件一起工作。 –

+0

谢谢,我几乎在那里我想,最后一个错误似乎让我失望...看到我更新的帖子。希望你能帮助! (PS我很多后更新道歉) – Flo