在以前的ASP.NET应用程序开发中,大家一直在为了URL更加友好而努力,于是乎出现了各种各样的URL Rewritting组件,但是URL Rewritting又有着先天的缺陷,它仅仅是单向的,只负责将相关的请求转到正确得HttpHandler上面去。在.NET Framework 3.5 SP1中,微软发布了一个Routing组件,其中ASP.NET MVC中就是使用该组件进行URL Routing,从而实现了非常友好的URL。Routing组件支持双向作用,既可以解析URL交给相关得HttpHandler来处理,同时也能根据相应的路由规则来生成正确的URL。现在在ASP.NET 4.0中已经内置了Routing功能,所以我们可以直接使用。
首先在Web.config中配置RoutingModule,如下代码所示,加在httpModules配置节中:
1: <add name="RoutingModule"
2: type="System.Web.Routing.UrlRoutingModule,
3: System.Web.Routing, Version=4.0.0.0,
4: Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
在HttpApplication启动时注册相关的Routing规则:
1: protected void Application_Start(object sender, EventArgs e)
2: {
3: RouteTable.Routes.Add("UserRoute", new Route("Users/{username}",
4: new PageRouteHandler("~/Users.aspx")));
5: }
此处用户访问类似于/Users/TerryLee这样的URL时,会转到Users.aspx进行处理。最终在Users.aspx页面中我们可以通过RouteData来获取相关参数:
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: this.Literal1.Text = RouteData.Values["username"].ToString();
4: }
效果如图所示:
前面我们说了Routing的作用是双向的,下面看一下如何通过Routing规则来生成URL,如下示例代码:
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: VirtualPathData pathData =
4: RouteTable.Routes.GetVirtualPath(
5: null,
6: "UserRoute",
7: new RouteValueDictionary { { "username", "TerryLee" } });
8: HyperLink1.NavigateUrl = pathData.VirtualPath;
9: }
最终生成的URL为:
1: <a id="HyperLink1" href="/Users/TerryLee">HyperLink</a>
除此之外,在ASP.NET 4.0中还提供了两个表达式构造器,可以使用使用它们直接在ASPX页面中构造URL或者获取URL参数:
1: <asp:HyperLink ID="HyperLink1" runat="server"
2: NavigateUrl="<%$RouteUrl:username=TerryLee%>">TerryLee</asp:HyperLink>
生成的URL与前面使用后台代码的方式一致,使用表达式获取RouteData,如下示例代码所示:
<asp:Literal ID="Literal1" runat="server" Text="<%$RouteValue:username%>"/>