ASPNET的WebForms当中最令人激赏的则莫过于是URLRouting机制的全面支持过去在ASPNETSP当中WebForms或多或少就开始支持URLRouting机制它让我们在网址的呈现以及使用上更加的有弹性
过去我们在ASPNET当中习惯于底下这样的网址呈现方式
但最近几年REST风格的网站(或RESTWeb服务)兴起你常常会看到网址的呈现方式变成http://myWebSite/Product/Edit/XBOX
上面这样的网址有一些好处首先网址可以更明确的表达想要呈现的功能或是要后端应用程序进行的行为其次上面这样的网址由于并非对应到后端某一个实体档案(aspxcs)而是透过Routing机制来转派因此相较过去的网址有着更高的安全性
也就是说在这样的架构下ASPNET应用程序的网址再也不只是对应到实体档案的路径而是可用来表达要执行的功能至于实际执行时要处理的程序代码或呈现结果的网页也并非一定要是由网址所指向的实体页面这也让我们在开发应用程序时有更大的弹性例如一般的部落格网站网址可能是『http://blog/studyhost』由于blog网站多半都可以开放给多人申请理所当然的每一个用户都有类似『http://blog/申请者ID』这样的网址当然对应到ASPNET的后端应该都是同一套程序来处理在过去的ASPNET应用程序当中我们得要煞费一番工夫才能让网站可以接受这样的网址设计(把参数从QueryString转变成REST风格)而现在透过URLRouting机制很快地就能轻松搞定
除此之外还有另一个显而易见的好处采用REST风格的网址http://myWebSite/Product/Edit/XBOXvs
相较于传统网址更容易被Google等搜索引擎查询与检索毕竟上图网址中的XBOX比起产品Id=来得容易理解的多那我们要如何在ASPNET当中使用这样的机制呢您只需要透过新加入的Routes类别利用MapPageRoute方法即可轻易的完成URL路由的指定例如
viewplaincopytoclipboardprint?
protectedvoidApplication_Start(objectsenderEventArgse){
RouteTableRoutesMapPageRoute(
"TestRoute""Search/{ProductName}""~/WebFormaspx");
}
protectedvoidApplication_Start(objectsenderEventArgse){
RouteTableRoutesMapPageRoute(
"TestRoute""Search/{ProductName}""~/WebFormaspx");
}
在Globalasax如此撰写之后当使用者在网址列键入http://localhost:/Search/AK
网页(应用程序主控权)将被导引到WebFormaspx页面而在该页面中则可以透过底下的方式来取得参数ProductName『AK』
viewplaincopytoclipboardprint?
protectedvoidPage_Load(objectsenderEventArgse){
ResponseWrite("SearchingProductName:"+
PageRouteDataValues["ProductName"]);
}
protectedvoidPage_Load(objectsenderEventArgse){
ResponseWrite("SearchingProductName:"+
PageRouteDataValues["ProductName"]);
}
这样的设计方式果然是方便容易许多别小看这样的机制这让我们开发大型的Web应用程序变为可能配合我们后面要介绍的ASPNET当中的DynamicData技术我们得以轻易的开发出单一的一张aspx网页(一支程序)即可维护后端Schema不同的各种数据表的不像过去ASPNET时代若后端数据库有许多数据表要处理我们几乎得要为每一个数据表建立独立的一张aspx维护页面即便每一张aspx网页上的行为与程序代码逻辑几乎完全一样(CRUD)
更有趣的是配合URLRouting机制的普及化连过去我们熟悉的DataSource控件都增加了一个RouteParameter来共襄盛举如今ASPNETWebForms可说是对URLRouting机制全面支持了
viewplaincopytoclipboardprint?
<asp:LinqDataSourceID="LinqDataSource"runat="server"
ContextTypeName
="UrlRoutingDataClassesDataContext"EntityTypeName
=""TableName="Customers"Where="CompanyName
==@CompanyName">
<WhereParameters>
<asp:RouteParameterName="CompanyName"RouteKey
="CompanyName"Type="String"/>
</WhereParameters>
</asp:LinqDataSource>
<asp:LinqDataSourceID="LinqDataSource"runat="server"
ContextTypeName=
"UrlRoutingDataClassesDataContext"EntityTypeName
=""TableName="Customers"Where="CompanyName
==@CompanyName">
<WhereParameters>
<asp:RouteParameterName="CompanyName"RouteKey
="CompanyName"Type="String"/>
</WhereParameters>
</asp:LinqDataSource>
您会发现透过上面这样的语法我们可以让LinqDataSource进行数据查询时where条件所使用的参数直接引用URLRouting中的参数值类似过去的QueryStringParameter相当的方便好用