成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET的路由系統:URL與物理文件的分離

開發 后端
表現為請求地址與目標Controller和Action的動態映射的URL路由系統并不是專屬于ASP.NET MVC,而是直接建立在ASP.NET 中。ASP.NET通過URL路由系統實現了請求地址與物理文件的分離。

表現為請求地址與目標Controller和Action的動態映射的URL路由系統并不是專屬于ASP.NET MVC,而是直接建立在ASP.NET 中。ASP.NET通過URL路由系統實現了請求地址與物理文件的分離。[源代碼地址從這里下載]

一、URL與物理文件的分離

對于一個 ASP.NET Web Form應用來說,任何一個請求都對應著某個具體的物理文件。部署在Web服務器上的物理文件可以是靜態的(比如圖片和靜態HTML文件等),也可以是動態的(比如.asxp文件)。對于靜態文件的請求,ASP.NET直接返回文件的整個內容;而針對動態文件的請求則會觸發相關代碼的執行,并最終返回執行后的結果。但是這種將URL與物理文件緊密綁定在一起的方式并不是一種好的解決方案,它帶來的局限性主要體現在如下幾個方面:

  • 靈活性:由于URL是對物理文件路徑的反映,意味著如果物理文件的路徑發生了改變(比如改變了文件的目錄結構或者文件名),原來基于該文件鏈接將變得無效。
  • 可讀性:在很多情況下,URL不僅僅需要能夠訪問正確的網絡資源,還需要具有很好的可讀性,***的URL應該讓我們一眼就能看出針對它訪問的目標資源是什么。請求地址與物理文件緊密綁定讓我們完全失去了定義高可讀性URL的機會。
  • SEO優化:對于網站開發來說,為了迎合搜索引擎檢索的規則,我們需要對URL進行有效的設計使之能易于被主流的引擎檢索收錄。如果URL完全與物理地址關聯,這無異于失去了SEO優化的能力。

出于針對URL與物理文件綁定機制帶來的上述局限,我們需要一種更加靈活的機制實現針對物理文件的請求地址與文件本身的路徑的分離,通過一種動態映射的機制實現URL與物理文件的關聯。

說到這里,可能很多人會想到URL重寫。為了使Web應用可以獨立地涉及用于訪問應用資源的URL,微軟為IIS 7編寫了一個URL重寫模塊。這是一個基于規則的URL重寫引擎,用于在URL被Web服務器處理之前改變請求的URL。對于動態Web應用程序,它可以為用戶和搜索引擎提供友好的URL,URL重寫和重定向是基于HTTP頭和服務器變量的,并可以對站點內容進行訪問控制。

URL重寫在 IIS級別解決了URL與物理地址的分離,它通過一個基于本地(Native)代碼的模塊注冊到IIS進行HTTP請求處理的管道上,所以可以應用于所以寄宿于IIS中的Web應用。而URL路由系統則是ASP.NET的一部分,是通過托管代碼實現的。為了讓讀者對ASP.NET的URL路由具有一個感官的認識,我們來演示一個簡單的實例。

二、 實例演示:通過URL路由實現請求地址與.aspx頁面的映射

接下來我們將創建一個簡單的ASP.NET Web Forms應用,并采用一個獨立于.aspx文件路徑的URL來訪問對應的Web頁面,而兩者之間的映射通過URL路由來實現。我們是一個關于員工管理的場景,我們將創建一個頁面來顯示員工的列表和某個員工的詳細信息,頁面呈現出來效果如下圖所示。

clip_image002

我們將關注點放到上圖所示的兩個頁面的URL上。用于顯示員工列表的頁面地址為http://localhost:2738/employees。當用戶點擊某個顯示為姓名的連接后,用于顯示所選員工詳細信息的頁面被呈現出現,其頁面地址的URL模式為http://localhost:2738/employees/{姓名}/{ID}。對于后者,最終用戶一眼可以從URL中看出通過該地址獲取的是哪個員工的信息。有人可能會問,為什么我們要在URL同時包含員工的姓名和ID呢?這是因為 ID(本例采用GUID)的可讀性不如員工姓名,但是員工姓名不具有唯一性,在這里我們使用的ID是為了邏輯處理的需要而提供的唯一標識,而姓名則是出于可讀性的需要。

我們將員工的所有 信息(ID、姓名、性別、出生日期和所在部門)定義在如下所示的Employee類型中。我們照例定義了如下一個EmployeeRepository類型表示維護員工列表的領域模型。維護的員工列表通過靜態字段employees 表示。EmployeeRepository的GetEmployees方法根據指定的ID返回指包含相應員工的列表,如果指定的ID為“*”,則返回所有員工列表

  1. public class Employee  
  2.  {  
  3.      public string     Id { getprivate set; }  
  4.      public string     Name { getprivate set; }  
  5.      public string     Gender { getprivate set; }  
  6.      public DateTime   BirthDate { getprivate set; }  
  7.      public string     Department { getprivate set; }  
  8.     
  9.      public Employee(string id, string name, string gender, DateTime birthDate, string department)  
  10.      {  
  11.          this.Id         = id;  
  12.          this.Name       = name;  
  13.          this.Gender     = gender;  
  14.         this.BirthDate  = birthDate;  
  15.         this.Department = department;  
  16.      }  
  17.  }  
  18.  public class EmployeeRepository  
  19.  {  
  20.      private static IList<Employee> employees;  
  21.      static EmployeeRepository()  
  22.      {  
  23.          employees = new List<Employee>();  
  24.          employees.Add(new Employee(Guid.NewGuid().ToString(), "張三""男",new DateTime(1981, 8, 24), "銷售部"));  
  25.          employees.Add(new Employee(Guid.NewGuid().ToString(), "李四""女",new DateTime(1982, 7, 10), "人事部"));  
  26.          employees.Add(new Employee(Guid.NewGuid().ToString(), "王五""男",new DateTime(1981, 9, 21), "人事部"));  
  27.      }  
  28.      public IEnumerable<Employee> GetEmployees(string id = "")  
  29.      {  
  30.          return employees.Where(e => e.Id == id || string.IsNullOrEmpty(id) || id=="*");  
  31.      }  
  32.  } 

對于如上圖所示的兩個頁面實際上對應著同一個.aspx文件,即作為Web應用默認頁面的Default.aspx。要通過一個獨立于物理路徑的URL來訪問該.aspx頁面,我們就需要采用URL路由機制來實現兩者之間的映射。為此我們在添加的Global.asax文件中編寫了如下幾行代碼。如下面的代碼片斷所示,在Application_Start方法中我們通過System.Web.Routing.RouteTable的Routes屬性得到了表示路由對象列表的System.Web.Routing.RouteCollection對象,并調用該列表對象的MapPageRoute方法將Default.aspx頁面(~/Default.aspx)與一個URL模板(employees/{name}/{id)進行了映射。

  1. public class Global : System.Web.HttpApplication  
  2. {  
  3.     protected void Application_Start(object sender, EventArgs e)  
  4.    {  
  5.         var defaults = new RouteValueDictionary{{"name","*"},{"id","*"}};  
  6.        RouteTable.Routes.MapPageRoute("""employees/{name}/{id}""~/Default.aspx"true,defaults);  
  7.     }  

作為MapPageRoute方法***一個參數的RouteValueDictionary對象用于指定定義在路由模板中相應變量({name}和{id})的默認值。對于指定了默認值的路由對象,在當前請求地址的后續部分缺失的情況下,它會采用提供的默認值對該地址進行填充之后再進行模式的匹配。在如上所示的代碼片斷中,我們將{name}和{id}兩變量的默認值均指定為“*”。對于針對URI為http://localhost:2738/employees的請求,我們注冊的路由對象會將其格式成http://localhost:2738/employees/*/*,后者無疑是和定義的URL模式變現出來的模式是匹配的。

在Default.aspx頁面中,我們分別采用GridView和DetailsView來顯示所有員工列表和某個列表的詳細信息,下面的代碼片斷表示該頁面主體部分的HTML。值得一提的是:GridView模板中顯示為員工姓名的HyperLinkField的連接采用了上面我們定義在URL模板(employees/{name}/{id))中的模式。

  1. <form id="form1" runat="server">  
  2.     <div id="page">  
  3.            <asp:GridView ID="GridViewEmployees" runat="server" AutoGenerateColumns="false" Width="100%">  
  4.            <Columns>  
  5.                 <asp:HyperLinkField HeaderText="姓名" DataTextField="Name" DataNavigateUrlFields="Name,Id" DataNavigateUrlFormatString="~/employees/{0}/{1}" />  
  6.                 <asp:BoundField DataField="Gender" HeaderText="性別" />  
  7.                <asp:BoundField DataField="BirthDate" HeaderText="出生日期" DataFormatString="{0:dd/MM/yyyy}" />  
  8.                <asp:BoundField DataField="Department" HeaderText="部門" />  
  9.             </Columns>  
  10.         </asp:GridView>  
  11.         <asp:DetailsView ID="DetailsViewEmployee" runat="server" AutoGenerateRows="false"  Width="100%">  
  12.            <Fields>  
  13.                 <asp:BoundField DataField="ID" HeaderText= "ID"  />  
  14.                <asp:BoundField DataField="Name" HeaderText= "姓名"  />  
  15.                 <asp:BoundField DataField="Gender" HeaderText="性別" />  
  16.                 <asp:BoundField DataField="BirthDate" HeaderText="出生日期" DataFormatString="{0:dd/MM/yyyy}" />  
  17.                 <asp:BoundField DataField="Department" HeaderText="部門" />  
  18.             </Fields>  
  19.        </asp:DetailsView>  
  20.     </div>  
  21. </form> 

Default.aspx頁面的整個后臺代碼定義如下。由于所有員工列表和單一員工的詳細信息均體現在該頁面中,所以我們需要根據其請求地址來判斷應該呈現怎樣的數據,而這可以通過RouteData屬性表示的路由數據來實現。Page具有一個類型為System.Web.Routing.RouteData的RouteData表示通過注冊的與當前請求匹配的路由對象對請求地址進行解析生成的路由數據。RouteData的Values屬性是一個存儲路由變量的字典,其Key為變量名稱。在如下所示的代碼片斷中,我們得到表示員工ID的路由變量(RouteData.Values["id"]),如果它是默認值則表示當前請求是針對員工列表的,反之則是這對指定的某個具體員工的。

  1. public partial class Default : Page  
  2. {  
  3.     private EmployeeRepository repository;  
  4.     public EmployeeRepository Repository  
  5.     {  
  6.         get { return null == repository ? repository = new EmployeeRepository() : repository; }  
  7.     }  
  8.     protected void Page_Load(object sender, EventArgs e)  
  9.     {             
  10.         if (this.IsPostBack)  
  11.         {  
  12.             return;  
  13.         }  
  14.         string employeeId = this.RouteData.Values["id"as string;  
  15.         if (employeeId == "*" || string.IsNullOrEmpty(employeeId))  
  16.        {  
  17.             this.GridViewEmployees.DataSource = this.Repository.GetEmployees();  
  18.             this.GridViewEmployees.DataBind();  
  19.             this.DetailsViewEmployee.Visible = false;  
  20.         }  
  21.         else 
  22.         {  
  23.             var employees = this.Repository.GetEmployees(employeeId);                 
  24.             this.DetailsViewEmployee.DataSource = employees;  
  25.             this.DetailsViewEmployee.DataBind();  
  26.             this.GridViewEmployees.Visible = false;  
  27.         }  
  28.     }          

原文鏈接:http://www.cnblogs.com/artech/archive/2012/03/19/aspnet-routing-01.html

【編輯推薦】

  1.  ASP.NET MVC3 從零開始一步步構建Web
  2. Node.js vs Opa: Web框架殺手
  3. 設計好脾氣的Web頁面
  4. Google Web App開發指南之構建優秀的Web Apps
  5. 如何解決IndexedDB在webkit內核下新舊版本的兼容問題
責任編輯:林師授 來源: 蔣金楠的博客
相關推薦

2009-07-27 17:15:51

URL RewriteASP.NET

2009-07-31 09:58:20

URL映射ASP.NET

2009-07-22 14:23:39

URL RewriteASP.NET

2009-07-23 16:28:20

URL映射ASP.NET 2.0

2009-07-29 17:29:46

ASP與ASP.NET

2009-07-31 09:39:59

ASP.NET和URL

2009-08-05 13:16:43

ASP.NET URL

2009-08-05 14:46:17

ASP.NET url

2009-01-04 13:27:10

URL RewriteIISASP.NET

2009-07-24 15:47:35

ASP.NET與ASP

2024-12-05 08:14:41

2014-08-21 09:31:06

路由

2009-10-26 15:55:43

URL Routing

2009-07-21 10:49:26

ASP.NET虛擬文件

2009-07-28 14:10:14

2009-07-27 10:22:43

ASP.NET Dro

2009-07-27 15:48:43

2009-07-29 11:19:03

JavaScriptASP.NET

2009-07-29 16:33:28

GreeterLogiASP.NET

2009-07-27 10:35:33

TypeConvertASP.NET
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频 亚洲视频 | 亚洲精品1区| 久久久久电影 | www.日本在线| 日本一本在线 | 国产精品一区二区av | 国产欧美在线播放 | 成年人在线观看视频 | 亚洲 一区 | 成人教育av| 亚洲欧美视频一区 | 青青草视频免费观看 | 欧美视频第三页 | 91亚洲精品在线 | 日韩欧美一区二区三区 | 久久午夜精品 | 欧美日韩在线播放 | 成人免费淫片aa视频免费 | 日韩欧美国产精品 | 国产精品欧美一区二区三区 | 91精品久久久 | 成人小视频在线免费观看 | 免费在线观看av网址 | 亚洲三级免费看 | 免费观看一级特黄欧美大片 | 91精品久久久久 | 日韩中文一区 | 91精品久久久久久久久中文字幕 | 国产精品成人一区二区三区 | 2019精品手机国产品在线 | 国产精品亚洲综合 | 成人在线免费观看视频 | 精品不卡| 97视频精品| 人人鲁人人莫人人爱精品 | 一区二区影院 | 91精品久久久久久久99 | 黄色91在线 | 国产剧情一区二区三区 | 97avcc | 亚洲精品乱码8久久久久久日本 |