ASP.NET Routing 初试
今天刚发现在Web Application 下也可以使用MVC中的Route功能,额,好吧,我out了。
以后可以像mvc中那样使用Route,可以不用Url Rewriting了.
1.添加Global.asax,添加并注册路由,具体代码如下:
记得加入System.Web.Routing引用。
protected void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } private void RegisterRoutes(RouteCollection routes) { routes.MapPageRoute("", "SalesReportSummary/{year}", "~/sales.aspx"); routes.MapPageRoute("SalesRoute", "SalesReport/{locale}/{year}", "~/sales.aspx"); routes.MapPageRoute("ExpensesRoute", "ExpenseReport/{locale}/{year}/{*extrainfo}", "~/expenses.aspx", true, new RouteValueDictionary { {"locale","US"}, {"year",DateTime.Now.Year.ToString()}}, new RouteValueDictionary { {"locale","[a-z]{2}"}, {"year",@"\d{4}"}} ); }
Route 的写法和MVC中基本相同。此处略去500字。
2.要想在页面中用Route代替物理文件路径有两种方法:
a.硬编码,即手动编写Route Url,但是如果之后你的Route 更改的话,你需要更改所有的硬编码URL。代码如下:
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/salesreportsummary/2010"> Sales Report - All locales, 2010 </asp:HyperLink>
b.让.net帮我们实现,并且没有上述方法的缺点。代码如下:
<asp:HyperLink ID="HyperLink5" runat="server" NavigateUrl="<%$RouteUrl:locale=CA,year=2009,routename=salesroute%>"> Sales Report - CA, 2009 </asp:HyperLink>
基于第二种方法,也可以在.cs/.vb中实现,如下:
HyperLink6是一个空的连接。
RouteValueDictionary parameters = new RouteValueDictionary{ {"locale","CA"}, {"year","2008"}, {"category","recreation"} }; VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, "ExpensesRoute", parameters); HyperLink6.NavigateUrl = vpd.VirtualPath;
3.既然使用Route Url,那就不可避免Url传值,可以使用如下方式:
<asp:Literal ID="Literal2" Text="<%$RouteValue:year%>" runat="server"></asp:Literal>
LocaleLiteral.Text = Page.RouteData.Values["locale"] == null ? "All locales" : Page.RouteData.Values["locale"].ToString();
额,关于<%$RouteValue:year%> 有点疑问:这种写法必须放在控件(Literal或者HyperLink等)的属性中显示(如上),而不能单独显示,否则会提示Literal expressions like <%$RouteUrl:year=2011%> are not allowed. Use <asp:Literal runat="server" Text="<%$RouteUrl:year=2011%>" /> instead.
此处请高手指教。MSDN上注:RouteUrl 表达式只能用在服务器控件的标记中。
全文见:http://msdn.microsoft.com/en-us/library/dd329551.aspx