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>
或者在cs文件中获取
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

posted @ 2011-06-21 14:47  忆起  阅读(1878)  评论(11编辑  收藏  举报