使用Asp.Net4新特性路由创建WebForm应用
ASP.NET 4 中的路由
1. 简介:
ASP.NET 4 增加了对使用 Web 窗体进行路由的内置支持。 路由是 ASP.NET 3.5 SP1 引入的一项功能,通过此功能可将应用程序配置为使用对用户和搜索引擎有意义的 URL,这样无需指定物理文件名。 使用这项功能,可以提高站点的用户友好度,并增加站点内容被搜索引擎发现的概率。
因此,我们可以使用在WebForm中使用路由,可以创建出类似mvc的那样简洁的url.比如:以前在asp.net的中,我们的url一般是http://xray2005.cnblogs.com/artcile.aspx?id=1 这样的.现在如果使用asp.net的路由,那么我们的url可能就是这样: http://xray2005.cnblogs.com/artcile/1 这样了,不需要想以前一样通过urlrewrite来实现了.下面介绍具体的步骤.
2. 准备环境:
下面的例子是在Window7(IIS7.5)+VS2010的环境实现的.当然也可以使用VS2008 SP1实现(但具体代码存在一些差异)
3. 添加路由规则:
首先使用asp.net创建一个空的web应用程序,然后添加全局文件Global.asax,引用命名空间System.Web.Routing,(如果没有的话,则向项目中添加对System.Web.Routing的引用)然后在Application_Start
事件中注册相应的路由.示例代码如下:
using System.Web.Routing;
protected void Application_Start(object sender, EventArgs e)
{
RegisteRoutes(RouteTable.Routes);
}
private void RegisteRoutes(RouteCollection routes)
{
routes.MapPageRoute("", "", "~/Default.aspx");
routes.MapPageRoute("list", "Items/{action}", "~/Items/list.aspx", false, new RouteValueDictionary { { "action", "all" } });
routes.MapPageRoute("show", "Show/{action}", "~/show.aspx", false, new RouteValueDictionary { { "action", "all" } });
routes.MapPageRoute("edit", "Edit/{id}", "~/edit.aspx", false, new RouteValueDictionary { { "id", "1" } }, new RouteValueDictionary { { "id", @"\d+" } });
}
其中需要说明的是asp.net 4中使用routes.MapPageRoute方法来添加相应的路由规则.它和.net 3.5 sp1中的routes.add是一样的.只不过更方便些.
routes.MapPageRoute:提供用于定义 Web 窗体应用程序的路由的方法。 有如下重载:
l MapPageRoute(String, String, String)
l MapPageRoute(String, String, String, Boolean)
l MapPageRoute(String, String, String, Boolean, RouteValueDictionary)
l MapPageRoute(String, String, String, Boolean, RouteValueDictionary, RouteValueDictionary)
l MapPageRoute(String, String, String, Boolean, RouteValueDictionary, RouteValueDictionary, RouteValueDictionary)
具体每个方法的解析可以查看msdn
下面就是对应注册的路由规则,来创建普通的ASP.NET页面了,如Default.aspx,show.aspx.edit.aspx等等.然后,我们就可以在运行例子来看看效果先了.如下图所示:
4. 获取URL中的参数
Page.RouteData中包含我们需要的URL参数.因此,我们可以通过以下方法来获取URL中的参数,如下:
方法一:在后台.CS文件写如下代码:
if (Page.RouteData.Values.ContainsKey("id"))
this.lb.Text = Page.RouteData.Values["id"].ToString();
方法二:在页面中直接使用RouteValue,如下:
<asp:Label ID="lb1" runat="server" Text="<%$RouteValue:id%>"></asp:Label>
5. 页面url连接的创建
在实际应用肯定是要页面跳转的,asp.net4提供了多种方法来创建符合路由规则的页面url。具体如下:
方法一:
直接按照规则,来创建url,如下:
<asp:HyperLink ID="link1" runat="server" Text="Show All" NavigateUrl="~/show/all">
</asp:HyperLink>
<br />
<asp:HyperLink ID="HyperLink1" runat="server" Text="Edit 1" NavigateUrl="~/Edit/1">
</asp:HyperLink>
方法二:
使用RouteUrl来创建url,如下:
<asp:HyperLink ID="HyperLink2" runat="server" Text="RouteUrl Show All " NavigateUrl="<%$RouteUrl:routename=show%> ">
</asp:HyperLink>
<br />
<asp:HyperLink ID="HyperLink3" runat="server" Text="RouteUrl Edit 2" NavigateUrl="<%$RouteUrl:id=2,routename=edit %>">
</asp:HyperLink>
<br />
这里,我们通过指定routename使得应用能够正确的引用规则,以便避免规则的混淆等等。
方法三:
通过.cs后台代码来现实,比如:页面有个超连接,如下:
<asp:HyperLink ID="HyperLink4" runat="server" Text="Code behind Edit 2">
</asp:HyperLink>
那么,后台.cs代码可以来给HyperLink的url赋值:
RouteValueDictionary p = new RouteValueDictionary { { "id", "3" } };
VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, "edit", p);
this.HyperLink4.NavigateUrl = vpd.VirtualPath;
至此,我们示范了如何使用asp.net 4中的路由来创建相应的webform应用。