ppp5p

作者:蓝天 http://sky.newssc.org

ASP.NET Routing 初试

今天刚发现在Web Application 下也可以使用MVC中的Route功能,额,好吧,我out了。
 
以后可以像mvc中那样使用Route,可以不用Url Rewriting了.
 
1.添加Global.asax,添加并注册路由,具体代码如下:
 
   记得加入System.Web.Routing引用。
 

 

 

 

 

01

protected void Application_Start(object sender, EventArgs e)

 

 

02

        {

 

 

03

            RegisterRoutes(RouteTable.Routes);

 

 

04

        }

 

 

05

 

 

 

06

 

 

 

07

private void RegisterRoutes(RouteCollection routes)

 

 

08

        {

 

 

09

            routes.MapPageRoute("",

 

 

10

                "SalesReportSummary/{year}",

 

 

11

                "~/sales.aspx");

 

 

12

 

 

 

13

            routes.MapPageRoute("SalesRoute",

 

 

14

                "SalesReport/{locale}/{year}",

 

 

15

                "~/sales.aspx");

 

 

16

 

 

 

17

            routes.MapPageRoute("ExpensesRoute",

 

 

18

                "ExpenseReport/{locale}/{year}/{*extrainfo}",

 

 

19

                "~/expenses.aspx", true,

 

 

20

                new RouteValueDictionary {

 

 

21

                    {"locale","US"},

 

 

22

                    {"year",DateTime.Now.Year.ToString()}},

 

 

23

                new RouteValueDictionary {

 

 

24

                    {"locale","[a-z]{2}"},

 

 

25

                    {"year",@"\d{4}"}}

 

 

26

                );

 

 

27

        }

 
   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.
 
此处请高手指教。

新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"

2011/6/21 14:56:47 | asp.net | |

  • 发表评论