天天看點

精進不休 .NET 4.0 (2) - asp.net 4.0 新特性之url路由

<a href="http://webabcd.blog.51cto.com/1787395/341053" target="_blank">[索引頁]</a>

<a href="http://cid-ebc0a6c186317ea6.office.live.com/self.aspx/Share/VS2010.rar" target="_blank">[源碼下載下傳]</a>

精進不休 .NET 4.0 (2) - asp.net 4.0 新特性之url路由, 自定義CacheProvider, 新增的表達式&lt;%: expression %&gt;, QueryExtender控件, 其它新特性

介紹

asp.net 4.0 的新增功能

在 web form 中做 url 路由 

通過實作自定義的 CacheProvider ,來實作自定義的頁面緩存邏輯 

新增的表達式 &lt;%: expression %&gt; 相當于 &lt;%= HttpUtility.HtmlEncode(expression) %&gt; 

控件 QueryExtender,對資料源控件獲得的資料做再檢索 

其它新特性

示例

1、web form 中的 url 路由的 demo

Global.asax.cs

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Web; 

using System.Web.Security; 

using System.Web.SessionState; 

using System.Web.Routing; 

namespace AspDotNet 

        public class Global : System.Web.HttpApplication 

        { 

void Application_Start() void Application_Start(object sender, EventArgs e) 

                { 

                        // 關于 Routing 可以參考以前寫的 http://webabcd.blog.51cto.com/1787395/341116 

                        // 其中 PageRouteHandler 類的作用是将 URL 路由的功能內建到 Web Form 中 

                        RouteTable.Routes.Add("myRoute", new Route("user/{userName}/{age}", new PageRouteHandler("~/UrlRouting/Default.aspx"))); 

                        /* 對應的配置如下,在 machine.config 中 

                        &lt;system.web&gt; 

                             &lt;httpmodule&gt; 

                                        &lt;add name="RoutingModule" type="System.Web.Routing.UrlRoutingModule"/&gt;    

                             &lt;/httpmodule&gt; 

                         */ 

                } 

        } 

}

UrlRouting/Default.aspx

&lt;%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 

        CodeBehind="Default.aspx.cs" Inherits="AspDotNet.UrlRouting.Default" %&gt; 

&lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"&gt; 

&lt;/asp:Content&gt; 

&lt;asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"&gt; 

        &lt;!-- 

                在頁面上擷取 url 路由而來的資料的方法 

                配合以下邏輯的路由規則是:"user/{userName}/{age}" 

        --&gt; 

        &lt;asp:Literal runat="server" Text="&lt;%$ RouteValue:userName%&gt;" /&gt; 

        &lt;br /&gt; 

        &lt;asp:Literal runat="server" Text="&lt;%$ RouteValue:age%&gt;" /&gt; 

                另外,對于資料源控件來說,也多了一種參數類型 RouteParameter    

&lt;%-- 

對應的配置如下,在 machine.config 中 

&lt;system.web&gt; 

     &lt;compilation debug="true" targetFrameworkMoniker=".NETFramework,Version=v4.0"&gt; 

            &lt;expressionBuilders&gt; 

                 &lt;add expressionPrefix="RouteValue" type="System.Web.Compilation.RouteValueExpressionBuilder" /&gt; 

            &lt;/expressionBuilders&gt; 

     &lt;/compilation&gt; 

--%&gt; 

UrlRouting/Default.aspx.cs

using System.Web.UI; 

using System.Web.UI.WebControls; 

namespace AspDotNet.UrlRouting 

        public partial class Default : System.Web.UI.Page 

void Page_Load() void Page_Load(object sender, EventArgs e) 

                        // 擷取 url 路由而來的資料 

                        // 配合以下邏輯的路由規則是:"user/{userName}/{age}" 

                        Response.Write("userName: " + RouteData.Values["userName"].ToString()); 

                        Response.Write("&lt;br /&gt;"); 

                        Response.Write("age: " + RouteData.Values["age"].ToString()); 

UrlRouting/RouteUrlExpressionBuilderDemo.aspx

        CodeBehind="RouteUrlExpressionBuilderDemo.aspx.cs" Inherits="AspDotNet.UrlRouting.RouteUrlExpressionBuilderDemo" %&gt; 

                在頁面上構造 url 路由的方式 

        &lt;asp:HyperLink ID="lnk1" runat="server" NavigateUrl="&lt;%$ RouteUrl:RouteName=myRoute, userName=webabcd, age=30 %&gt;" 

                Text="goto" /&gt; 

        &lt;br /&gt;&lt;br /&gt; 

        &lt;asp:HyperLink ID="lnk2" runat="server" Text="goto" /&gt; 

                 &lt;add expressionPrefix="RouteUrl" type="System.Web.Compilation.RouteUrlExpressionBuilder"/&gt; 

--%&gt;

UrlRouting/RouteUrlExpressionBuilderDemo.aspx.cs

using System.Web.Compilation; 

        public partial class RouteUrlExpressionBuilderDemo : System.Web.UI.Page 

                        // 在代碼中構造 url 路由的方式 

                        string expression = String.Format("RouteName={0}, userName={1}, age={2}", "myRoute", "webabcd", "30"); 

                        lnk2.NavigateUrl = RouteUrlExpressionBuilder.GetRouteUrl(this, expression); 

2、自定義 CacheProvider

CachingEnhancement.aspx

&lt;%-- OutputCache 目前不支援直接設定 providerName 屬性 --%&gt; 

&lt;%@ OutputCache Duration="30" VaryByParam="None" %&gt; 

        CodeBehind="CachingEnhancement.aspx.cs" Inherits="AspDotNet.CachingEnhancement" %&gt; 

        &lt;%= DateTime.Now.ToString() %&gt; 

&lt;/asp:Content&gt;

CachingEnhancement.aspx.cs

using System.Web.Caching; 

using System.Security.Cryptography; 

using System.Text; 

using System.IO; 

using System.Runtime.Serialization.Formatters.Binary; 

        public partial class CachingEnhancement : System.Web.UI.Page 

        // 重寫 OutputCacheProvider 抽象類,以實作自定義的緩存實作(需要重寫的方法是 Add, Get, Remove, Set) 

        // 本 Demo 示範了,如何開發一個自定義的 CacheProvider,來實作将資料緩存到硬碟的功能 

        public class FileCacheProvider : OutputCacheProvider 

                private string _cachePathPrefix = @"c:\"; 

string MD5() string MD5(string s) 

                        var provider = new MD5CryptoServiceProvider(); 

                        var bytes = Encoding.UTF8.GetBytes(s); 

                        var builder = new StringBuilder(); 

                        bytes = provider.ComputeHash(bytes); 

                        foreach (var b in bytes) 

                                builder.Append(b.ToString("x2").ToLower()); 

                        return builder.ToString(); 

                /// &lt;summary&gt; 

                /// 将指定的 key ,做md5 加密後,拼出一個路徑,做為儲存此 key 對應的對象的檔案(此例隻做示範用) 

                /// &lt;/summary&gt; 

                /// &lt;param name="key"&gt;緩存 key&lt;/param&gt; 

                /// &lt;returns&gt;&lt;/returns&gt; 

string GetPathFromKey() string GetPathFromKey(string key) 

                        return _cachePathPrefix + MD5(key) + ".txt"; 

                /// 将對象放入自定義的緩存中 

                /// &lt;param name="entry"&gt;緩存對象&lt;/param&gt; 

                /// &lt;param name="utcExpiry"&gt;緩存的過期時間&lt;/param&gt; 

override object Add() override object Add(string key, object entry, DateTime utcExpiry) 

                        var path = GetPathFromKey(key); 

                        // 指定的 key 已被緩存了,則不做任何處理 

                        if (File.Exists(path)) 

                                return entry; 

                        // 将對象緩存到硬碟上的指定檔案 

                        using (var file = File.OpenWrite(path)) 

                        { 

                                var item = new CacheItem { Expires = utcExpiry, Item = entry }; 

                                var formatter = new BinaryFormatter(); 

                                formatter.Serialize(file, item); 

                        } 

                        return entry; 

                /// 在緩存中,根據指定的 key 擷取緩存對象 

override object Get() override object Get(string key) 

                        // 未找到緩存 

                        if (!File.Exists(path)) 

                                return null; 

                        CacheItem item = null; 

                        // 如果有緩存的話,則取出緩存對象 

                        using (var file = File.OpenRead(path)) 

                                item = (CacheItem)formatter.Deserialize(file); 

                        // 緩存過期或緩存中無資料,則删除此緩存所對應的硬碟上的實體檔案 

                        if (item == null || item.Expires &lt;= DateTime.Now.ToUniversalTime()) 

                                Remove(key); 

                        return item.Item; 

                /// 根據指定的 key 删除緩存對象 

override void Remove() override void Remove(string key) 

                                File.Delete(path); 

                /// 更新緩存 

override void Set() override void Set(string key, object entry, DateTime utcExpiry) 

                        var item = new CacheItem { Expires = utcExpiry, Item = entry }; 

                /// 封裝了需要被緩存的對象的一個可序列化的對象 

                [Serializable] 

                internal class CacheItem 

                        /// &lt;summary&gt; 

                        /// 緩存對象 

                        /// &lt;/summary&gt; 

                        public object Item; 

                        /// 緩存對象的過期時間 

                        public DateTime Expires; 

Web.config

&lt;!--緩存配置--&gt; 

&lt;caching&gt; 

        &lt;!--預設的緩存實作是 AspNetInternalProvider(即 asp.net 自帶的基于記憶體的緩存實作方式)--&gt; 

        &lt;outputCache defaultProvider="AspNetInternalProvider"&gt; 

                &lt;providers&gt; 

                        &lt;!-- 

                                新增一個緩存的 provider 配置 

                                具體實作見 CachingEnhancement.aspx.cs 

                        --&gt; 

                        &lt;add name="FileCache" type="AspDotNet.FileCacheProvider, AspDotNet"/&gt; 

                &lt;/providers&gt; 

        &lt;/outputCache&gt; 

&lt;/caching&gt;

                // 根據 HttpContext 的不同,可以為其指定不同的 CacheProvider 

override string GetOutputCacheProviderName() override string GetOutputCacheProviderName(HttpContext context) 

                        // 符合此條件的,則緩存的實作使用自定義的 FileCacheProvider 

                        // 自定義緩存實作見 CachingEnhancement.aspx.cs 

                        // CacheProvider 的配置見 web.config 

                        // 頁面的緩存時間見 CachingEnhancement.aspx 

                        if (context.Request.Path.ToLower().EndsWith("cachingenhancement.aspx")) 

                                return "FileCache"; 

                        else 

                                return base.GetOutputCacheProviderName(context); 

3、表達式 &lt;%: expression %&gt; 的 demo

HtmlEncodedCodeExpressions.aspx

        CodeBehind="HtmlEncodedCodeExpressions.aspx.cs" Inherits="AspDotNet.HtmlEncodedCodeExpressions" %&gt; 

        &lt;%-- 

                新增的一個表達式 &lt;%: expression %&gt; 相當于 &lt;%= HttpUtility.HtmlEncode(expression) %&gt; 

        --%&gt; 

        &lt;%= "&lt;strong&gt;strong&lt;/strong&gt;" %&gt; 

        &lt;%: "&lt;strong&gt;strong&lt;/strong&gt;" %&gt; 

        &lt;%= HttpUtility.HtmlEncode("&lt;strong&gt;strong&lt;/strong&gt;") %&gt; 

4、QueryExtender 控件的 demo

QueryExtenderDemo.aspx

        CodeBehind="QueryExtenderDemo.aspx.cs" Inherits="AspDotNet.QueryExtenderDemo" %&gt; 

        &lt;asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="LinqDataSource1"&gt; 

                &lt;Columns&gt; 

                        &lt;asp:BoundField DataField="ProductId" HeaderText="ProductId" SortExpression="ProductId" /&gt; 

                        &lt;asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" /&gt; 

                        &lt;asp:BoundField DataField="ProductPrice" HeaderText="ProductPrice" SortExpression="ProductPrice" /&gt; 

                &lt;/Columns&gt; 

        &lt;/asp:GridView&gt; 

        &lt;asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="AspDotNet.QueryExtenderDemo" 

                EntityTypeName="AspDotNet.Product" TableName="Data"&gt; 

        &lt;/asp:LinqDataSource&gt; 

                QueryExtender - 和資料源控件結合使用,以對資料源控件中檢索到的資料做再次檢索 

                        SearchExpression - 根據指定的字段查找指定的資料 

                        RangeExpression - 在指定字段中查找指定範圍的資料 

                        PropertyExpression - 查找某字段的值為某指定的值的資料 

                        OrderByExpression - 用于排序資料 

                        CustomExpression - 自定義查詢表達式 

        &lt;asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="LinqDataSource1"&gt; 

                &lt;asp:SearchExpression DataFields="ProductName" SearchType="EndsWith"&gt; 

                        &lt;asp:Parameter Type="String" DefaultValue="0" /&gt; 

                &lt;/asp:SearchExpression&gt; 

        &lt;/asp:QueryExtender&gt; 

QueryExtenderDemo.aspx.cs

        public partial class QueryExtenderDemo : System.Web.UI.Page 

                // 為 GridView 提供資料 

                public List&lt;Product&gt; Data 

                        get 

                                Random random = new Random(); 

                                List&lt;Product&gt; products = new List&lt;Product&gt;(); 

                                for (int i = 0; i &lt; 100; i++) 

                                { 

                                        products.Add(new Product { ProductId = i + 1, ProductName = "名稱" + i.ToString().PadLeft(2, '0'), ProductPrice = random.NextDouble() }); 

                                } 

                                return products; 

                // 為 GridView 提供資料的實體類 

                public class Product 

                        public int ProductId { get; set; } 

                        public string ProductName { get; set; } 

                        public double ProductPrice { get; set; } 

5、其他新特性的簡單說明

Others.aspx

&lt;%@ Page Title="其它,一筆帶過" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 

        CodeBehind="Others.aspx.cs" Inherits="AspDotNet.Others" %&gt; 

        &lt;style&gt; 

                body 

                        font-size: 12px; 

                textarea 

                        width: 99%; 

        &lt;/style&gt; 

        &lt;p&gt; 

                1、Permanent Redirect - 可以實作 301 跳轉 

                &lt;ul&gt; 

                        &lt;li&gt;Response.RedirectPermanent() - 永久性重定向(http 301)。&lt;/li&gt; 

                        &lt;li&gt;Response.Redirect() - 臨時性重定向(http 302)。&lt;/li&gt; 

                &lt;/ul&gt; 

        &lt;/p&gt; 

                2、Session 壓縮(設定 sessionState 節點的 compressionEnabled 屬性) 

                &lt;br /&gt; 

                對于使用程序外會話狀态伺服器的會話狀态提供程式,或者将會話狀态儲存在 sqlserver 資料庫中的會話狀态提供程式,現在為提高其效率新增了壓縮 Session 資料的功能(使用System.IO.Compression.GZipStream來壓縮資料),像如下這樣的配置 

                &lt;textarea rows="6"&gt; 

                        &lt;sessionState 

                            mode="SqlServer" 

                            sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate" 

                            allowCustomSqlDatabase="true" 

                            compressionEnabled="true" 

                        /&gt; 

                &lt;/textarea&gt; 

                3、httpRuntime 節點的新增配置 

                        &lt;li&gt;maxRequestPathLength - url 路徑的最大長度(基于NTFS檔案路徑的最大長度就是 260)&lt;/li&gt; 

                        &lt;li&gt;maxQueryStringLength - url 的最大長度&lt;/li&gt; 

                        &lt;li&gt;requestPathInvalidChars - 指定 url 路徑的無效字元&lt;/li&gt; 

                        &lt;li&gt;requestValidationType - 繼承 System.Web.Util.RequestValidator 抽象類,重寫其 IsValidRequestString() 方法,以實作自定義的請求驗證。在 requestValidationType 可以指定使用這個自定義的類&lt;/li&gt; 

                        &lt;li&gt;encoderType - 重寫 System.Web.Util.HttpEncoder,可以實作自定義的 html編碼, url編碼, http header編碼。在 encoderType 指定這個自定義編碼的類後,程式中所用到的 System.Web.HttpUtility 或 System.Web.HttpServerUtility 的相關方法将會使用自定義的編碼實作&lt;/li&gt; 

                &lt;textarea rows="2"&gt; 

                        &lt;httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" requestPathInvalidChars="&lt;,&gt;,*,%,&amp;,:,\,?" requestValidationType="Samples.MyValidator, Samples" encoderType="Samples.MyEncoder, Samples" /&gt; 

                4、compilation 節點新增 targetFramework 屬性,用于指定程式運作的目标架構 

                &lt;textarea&gt; 

                        &lt;compilation targetFramework="4.0" /&gt; 

                5、asp.net 4.0 結合 iis 7.5 可使 web 應用程式自動啟動 

                在 web 程式中實作 System.Web.Hosting.IProcessHostPreloadClient 接口,用于被 iis 啟動 

                6、Page 類中新增了兩個屬性,分别是 MetaDescription 和 MetaKeywords 

                7、以前每個可顯示的控件都有 Enabled 屬性(如果 Enabled="false" 則對應的 HTML 為 disabled="disabled"),但是 HTML 4.01 的标準是隻有 input 才能有 disabled 屬性 

                        &lt;li&gt; 

                                在 pages 節點中設定 controlRenderingCompatibilityVersion="3.5",則所有可顯示控件都會輸出 disabled="disabled" 

                        &lt;/li&gt; 

                                在 pages 節點中設定 controlRenderingCompatibilityVersion="4.0",則隻有 input 元素才會輸出 disabled="disabled",非 input 元素将會自動标記一個名為 aspnetdisabled 的 css 類 

                8、web form 需要在頁面上寫入隐藏域(如為了儲存 ViewState 的隐藏域),在 asp.net 4.0 中系統将在這類的隐藏域外的 div 上标記一個名為 aspNetHidden 的 css 類,以友善樣式控制 

                9、ASP.NET Chart Control - 執行個體參考 http://code.msdn.microsoft.com/mschart 

OK 

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/341124,如需轉載請自行聯系原作者

繼續閱讀