我的方案如下:场地可以是多个类别的一部分,用户也可以在多个类别类型上添加过滤器,因此我的网址现在就像:
/venues/beaches/boats/themeparks
(这将显示所有场地,即海滩和船只和主题公园)/venues/beaches/boats
/venues
等。因此,不同场地类型(海滩,船只,主题公园等)的数量是动态和可选的。如何设置我的重写规则,category
查询字符串参数包含所有不同的地点类型,或者最好{i}}参数添加多次,如果没有提供venuetype category
将只为空/空?
对于网址:category
我得到了这个重写的网址:/venues/beaches/boats/themeparks
对于网址:search.aspx?category=beaches&category=boats&category=themeparks
我得到了这个重写的网址:/venues
(或者也可以:search.aspx?category=
)
我现在只有这个:
search.aspx
更新
我选择了以下@Arindam Nayak的建议。
我安装了https://www.nuget.org/packages/Microsoft.AspNet.FriendlyUrls.Core/并在<rule name="venue types">
<match url="^venues/([a-zA-Z0-9-+']+)$"/>
<action type="Rewrite" url="search.aspx?category={R:1}"/>
</rule>
文件夹中手动创建了RouteConfig.vb
文件。我补充说(作为测试):
App_Start
在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
时,它现在可以正确地将我重定向到contact.aspx。 (请注意:网址重写 - 因此www.example.com/test
或web.config
文件中的规则优先于rewriteRules.config
!)
我几乎就在那里,所以这个RouteConfig.vb
正确地重定向到文件www.example.com/test
但是这个contact.aspx
会引发404错误:
更新2
我添加了日志记录到www.example.com/test/boats/outside/more/fields/are/here
:
routeConfig.vb
这些行都被执行了。现在发生了一些奇怪的事情: 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")
网址/test
页面我也尝试过:
contact.aspx
网址所以看来routeConfig只被击中一次(在applicationstart?)然后再也没有击中。对于请求/test/boats/outside/more/fields/are/here
,它到达routeConfig.vb文件,但由于某种原因未显示/test/boats/outside/more/fields/are/here
...
更新3
我发现当我明确定义路由时,它确实有效,如下:
contact.aspx
现在网址routes.MapPageRoute("", "test", "~/contact.aspx")
routes.MapPageRoute("", "test/123", "~/contact.aspx")
和/test
有效,但这根本不是动态的,因为我只想在/test/123
上匹配,然后获取FriendlyUrlSegments。
我无法在线发布代码,因此如果有帮助,请点击我的解决方案资源管理器:
我该怎么办?
答案 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/themeparks
或http://www.example.com/venues/beaches
时,它会点击venues.aspx
。在venues.aspx.cs
,page_load
事件中,您需要拥有以下代码。
IList<String> str = Request.GetFriendlyUrlSegments();
对于case-1,str将为['beaches','boats','themeparks']
,而对于case-2,则为['beaches']
。
有关详情,请参阅my blog或类似的答案 - Reroute query string using friendlyUrl
请告诉我,如果您遇到任何问题,或者您的问题仍未得到解决。