<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, 新增的表達式<%: expression %>, QueryExtender控件, 其它新特性
介紹
asp.net 4.0 的新增功能
在 web form 中做 url 路由
通過實作自定義的 CacheProvider ,來實作自定義的頁面緩存邏輯
新增的表達式 <%: expression %> 相當于 <%= HttpUtility.HtmlEncode(expression) %>
控件 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 中
<system.web>
<httpmodule>
<add name="RoutingModule" type="System.Web.Routing.UrlRoutingModule"/>
</httpmodule>
*/
}
}
}
UrlRouting/Default.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="AspDotNet.UrlRouting.Default" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<!--
在頁面上擷取 url 路由而來的資料的方法
配合以下邏輯的路由規則是:"user/{userName}/{age}"
-->
<asp:Literal runat="server" Text="<%$ RouteValue:userName%>" />
<br />
<asp:Literal runat="server" Text="<%$ RouteValue:age%>" />
另外,對于資料源控件來說,也多了一種參數類型 RouteParameter
<%--
對應的配置如下,在 machine.config 中
<system.web>
<compilation debug="true" targetFrameworkMoniker=".NETFramework,Version=v4.0">
<expressionBuilders>
<add expressionPrefix="RouteValue" type="System.Web.Compilation.RouteValueExpressionBuilder" />
</expressionBuilders>
</compilation>
--%>
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("<br />");
Response.Write("age: " + RouteData.Values["age"].ToString());
}
UrlRouting/RouteUrlExpressionBuilderDemo.aspx
CodeBehind="RouteUrlExpressionBuilderDemo.aspx.cs" Inherits="AspDotNet.UrlRouting.RouteUrlExpressionBuilderDemo" %>
在頁面上構造 url 路由的方式
<asp:HyperLink ID="lnk1" runat="server" NavigateUrl="<%$ RouteUrl:RouteName=myRoute, userName=webabcd, age=30 %>"
Text="goto" />
<br /><br />
<asp:HyperLink ID="lnk2" runat="server" Text="goto" />
<add expressionPrefix="RouteUrl" type="System.Web.Compilation.RouteUrlExpressionBuilder"/>
--%>
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
<%-- OutputCache 目前不支援直接設定 providerName 屬性 --%>
<%@ OutputCache Duration="30" VaryByParam="None" %>
CodeBehind="CachingEnhancement.aspx.cs" Inherits="AspDotNet.CachingEnhancement" %>
<%= DateTime.Now.ToString() %>
</asp:Content>
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();
/// <summary>
/// 将指定的 key ,做md5 加密後,拼出一個路徑,做為儲存此 key 對應的對象的檔案(此例隻做示範用)
/// </summary>
/// <param name="key">緩存 key</param>
/// <returns></returns>
string GetPathFromKey() string GetPathFromKey(string key)
return _cachePathPrefix + MD5(key) + ".txt";
/// 将對象放入自定義的緩存中
/// <param name="entry">緩存對象</param>
/// <param name="utcExpiry">緩存的過期時間</param>
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 <= 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
/// <summary>
/// 緩存對象
/// </summary>
public object Item;
/// 緩存對象的過期時間
public DateTime Expires;
Web.config
<!--緩存配置-->
<caching>
<!--預設的緩存實作是 AspNetInternalProvider(即 asp.net 自帶的基于記憶體的緩存實作方式)-->
<outputCache defaultProvider="AspNetInternalProvider">
<providers>
<!--
新增一個緩存的 provider 配置
具體實作見 CachingEnhancement.aspx.cs
-->
<add name="FileCache" type="AspDotNet.FileCacheProvider, AspDotNet"/>
</providers>
</outputCache>
</caching>
// 根據 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、表達式 <%: expression %> 的 demo
HtmlEncodedCodeExpressions.aspx
CodeBehind="HtmlEncodedCodeExpressions.aspx.cs" Inherits="AspDotNet.HtmlEncodedCodeExpressions" %>
<%--
新增的一個表達式 <%: expression %> 相當于 <%= HttpUtility.HtmlEncode(expression) %>
--%>
<%= "<strong>strong</strong>" %>
<%: "<strong>strong</strong>" %>
<%= HttpUtility.HtmlEncode("<strong>strong</strong>") %>
4、QueryExtender 控件的 demo
QueryExtenderDemo.aspx
CodeBehind="QueryExtenderDemo.aspx.cs" Inherits="AspDotNet.QueryExtenderDemo" %>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="LinqDataSource1">
<Columns>
<asp:BoundField DataField="ProductId" HeaderText="ProductId" SortExpression="ProductId" />
<asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" />
<asp:BoundField DataField="ProductPrice" HeaderText="ProductPrice" SortExpression="ProductPrice" />
</Columns>
</asp:GridView>
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="AspDotNet.QueryExtenderDemo"
EntityTypeName="AspDotNet.Product" TableName="Data">
</asp:LinqDataSource>
QueryExtender - 和資料源控件結合使用,以對資料源控件中檢索到的資料做再次檢索
SearchExpression - 根據指定的字段查找指定的資料
RangeExpression - 在指定字段中查找指定範圍的資料
PropertyExpression - 查找某字段的值為某指定的值的資料
OrderByExpression - 用于排序資料
CustomExpression - 自定義查詢表達式
<asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="LinqDataSource1">
<asp:SearchExpression DataFields="ProductName" SearchType="EndsWith">
<asp:Parameter Type="String" DefaultValue="0" />
</asp:SearchExpression>
</asp:QueryExtender>
QueryExtenderDemo.aspx.cs
public partial class QueryExtenderDemo : System.Web.UI.Page
// 為 GridView 提供資料
public List<Product> Data
get
Random random = new Random();
List<Product> products = new List<Product>();
for (int i = 0; i < 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
<%@ Page Title="其它,一筆帶過" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
CodeBehind="Others.aspx.cs" Inherits="AspDotNet.Others" %>
<style>
body
font-size: 12px;
textarea
width: 99%;
</style>
<p>
1、Permanent Redirect - 可以實作 301 跳轉
<ul>
<li>Response.RedirectPermanent() - 永久性重定向(http 301)。</li>
<li>Response.Redirect() - 臨時性重定向(http 302)。</li>
</ul>
</p>
2、Session 壓縮(設定 sessionState 節點的 compressionEnabled 屬性)
<br />
對于使用程序外會話狀态伺服器的會話狀态提供程式,或者将會話狀态儲存在 sqlserver 資料庫中的會話狀态提供程式,現在為提高其效率新增了壓縮 Session 資料的功能(使用System.IO.Compression.GZipStream來壓縮資料),像如下這樣的配置
<textarea rows="6">
<sessionState
mode="SqlServer"
sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate"
allowCustomSqlDatabase="true"
compressionEnabled="true"
/>
</textarea>
3、httpRuntime 節點的新增配置
<li>maxRequestPathLength - url 路徑的最大長度(基于NTFS檔案路徑的最大長度就是 260)</li>
<li>maxQueryStringLength - url 的最大長度</li>
<li>requestPathInvalidChars - 指定 url 路徑的無效字元</li>
<li>requestValidationType - 繼承 System.Web.Util.RequestValidator 抽象類,重寫其 IsValidRequestString() 方法,以實作自定義的請求驗證。在 requestValidationType 可以指定使用這個自定義的類</li>
<li>encoderType - 重寫 System.Web.Util.HttpEncoder,可以實作自定義的 html編碼, url編碼, http header編碼。在 encoderType 指定這個自定義編碼的類後,程式中所用到的 System.Web.HttpUtility 或 System.Web.HttpServerUtility 的相關方法将會使用自定義的編碼實作</li>
<textarea rows="2">
<httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" requestPathInvalidChars="<,>,*,%,&,:,\,?" requestValidationType="Samples.MyValidator, Samples" encoderType="Samples.MyEncoder, Samples" />
4、compilation 節點新增 targetFramework 屬性,用于指定程式運作的目标架構
<textarea>
<compilation targetFramework="4.0" />
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 屬性
<li>
在 pages 節點中設定 controlRenderingCompatibilityVersion="3.5",則所有可顯示控件都會輸出 disabled="disabled"
</li>
在 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,如需轉載請自行聯系原作者