asp.net 4.0 新特性(二)

web form 中做 url 路由

通过实现自定义的 CacheProvider ,来实现自定义的页面缓存逻辑

新增的表达式 <%: expression %> 相当于 <%= HttpUtility.HtmlEncode(expression) %>

控件 QueryExtender,对数据源控件获得的数据做再检索

其它新特性

 

示例

 

1web form 中的 url 路由的 demo

 

Global.asax.cs

 

代码

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.SessionState;
  7. using System.Web.Routing;
  8. namespace AspDotNet
  9. {
  10.     public class Global : System.Web.HttpApplication
  11.     {
  12.         protected void Application_Start(object sender, EventArgs e)
  13.         {
  14.             // 关于 Routing 可以参考以前写的 http://www.cnblogs.com/webabcd/archive/2009/04/21/1440149.html
  15.             // 其中 PageRouteHandler 类的作用是将 URL 路由的功能集成到 Web Form 中
  16.             RouteTable.Routes.Add("myRoute", new Route("user/{userName}/{age}", new PageRouteHandler("~/UrlRouting/Default.aspx")));
  17.             /* 对应的配置如下,在 machine.config 中
  18.             <system.web>
  19.                <httpmodule>
  20.                     <add name="RoutingModule" type="System.Web.Routing.UrlRoutingModule"/>
  21.                </httpmodule>
  22.             <system.web>
  23.              */
  24.         }
  25.     }
  26. }

UrlRouting/Default.aspx.cs

代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. namespace AspDotNet.UrlRouting
  8. {
  9.     public partial class Default : System.Web.UI.Page
  10.     {
  11.         protected void Page_Load(object sender, EventArgs e)
  12.         {
  13.             // 获取 url 路由而来的数据
  14.             // 配合以下逻辑的路由规则是:"user/{userName}/{age}"
  15.             Response.Write("userName: " + RouteData.Values["userName"].ToString());
  16.             Response.Write("<br />");
  17.             Response.Write("age: " + RouteData.Values["age"].ToString());
  18.         }
  19.     }
  20. }

UrlRouting/RouteUrlExpressionBuilderDemo.aspx

代码

  1. <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
  2.     CodeBehind="RouteUrlExpressionBuilderDemo.aspx.cs" Inherits="AspDotNet.UrlRouting.RouteUrlExpressionBuilderDemo" %>
  3. <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
  4. </asp:Content>
  5. <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  6.     <!--
  7.         在页面上构造 url 路由的方式
  8.     -->
  9.     <asp:HyperLink ID="lnk1" runat="server" NavigateUrl="<%$ RouteUrl:RouteName=myRoute, userName=webabcd, age=30 %>"
  10.         Text="goto" />
  11.     <br /><br />
  12.     <asp:HyperLink ID="lnk2" runat="server" Text="goto" />
  13. </asp:Content>
  14. <%--
  15. 对应的配置如下,在 machine.config 中
  16. <system.web>
  17.    <compilation debug="true" targetFrameworkMoniker=".NETFramework,Version=v4.0">
  18.       <expressionBuilders>
  19.          <add expressionPrefix="RouteUrl" type="System.Web.Compilation.RouteUrlExpressionBuilder"/>
  20.       </expressionBuilders>
  21.    </compilation>
  22. <system.web>
  23. --%>

 

UrlRouting/RouteUrlExpressionBuilderDemo.aspx.cs

代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Web.Compilation;
  8. namespace AspDotNet.UrlRouting
  9. {
  10.     public partial class RouteUrlExpressionBuilderDemo : System.Web.UI.Page
  11.     {
  12.         protected void Page_Load(object sender, EventArgs e)
  13.         {
  14.             // 在代码中构造 url 路由的方式
  15.             string expression = String.Format("RouteName={0}, userName={1}, age={2}", "myRoute", "webabcd", "30");
  16.             lnk2.NavigateUrl = RouteUrlExpressionBuilder.GetRouteUrl(this, expression);
  17.         }
  18.     }
  19. }

 

2、自定义 CacheProvider

 

CachingEnhancement.aspx

 

代码

 

  1. <%-- OutputCache 目前不支持直接设置 providerName 属性 --%>
  2. <%@ OutputCache Duration="30" VaryByParam="None" %>
  3. <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
  4. CodeBehind="CachingEnhancement.aspx.cs" Inherits="AspDotNet.CachingEnhancement" %>
  5. <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
  6. </asp:Content>
  7. <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  8.     <%= DateTime.Now.ToString() %>
  9. </asp:Content>

 

 

 

CachingEnhancement.aspx.cs

 

代码

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Web.Caching;
  8. using System.Security.Cryptography;
  9. using System.Text;
  10. using System.IO;
  11. using System.Runtime.Serialization.Formatters.Binary;
  12. namespace AspDotNet
  13. {
  14.     public partial class CachingEnhancement : System.Web.UI.Page
  15.     {
  16.         protected void Page_Load(object sender, EventArgs e)
  17.         {
  18.            
  19.         }
  20.     }
  21.     // 重写 OutputCacheProvider 抽象类,以实现自定义的缓存实现(需要重写的方法是 Add, Get, Remove, Set)
  22.     // 本 Demo 演示了,如何开发一个自定义的 CacheProvider,来实现将数据缓存到硬盘的功能
  23.     public class FileCacheProvider : OutputCacheProvider
  24.     {
  25.         private string _cachePathPrefix = @"c:\";
  26.         private string MD5(string s)
  27.         {
  28.             var provider = new MD5CryptoServiceProvider();
  29.             var bytes = Encoding.UTF8.GetBytes(s);
  30.             var builder = new StringBuilder();
  31.             bytes = provider.ComputeHash(bytes);
  32.             foreach (var b in bytes)
  33.                 builder.Append(b.ToString("x2").ToLower());
  34.             return builder.ToString();
  35.         }
  36.         /// <summary>
  37.         /// 将指定的 key ,做md5 加密后,拼出一个路径,做为保存此 key 对应的对象的文件(此例只做演示用)
  38.         /// </summary>
  39.         /// <param name="key">缓存 key</param>
  40.         /// <returns></returns>
  41.         private string GetPathFromKey(string key)
  42.         {
  43.             return _cachePathPrefix + MD5(key) + ".txt";
  44.         }
  45.         /// <summary>
  46.         /// 将对象放入自定义的缓存中
  47.         /// </summary>
  48.         /// <param name="key">缓存 key</param>
  49.         /// <param name="entry">缓存对象</param>
  50.         /// <param name="utcExpiry">缓存的过期时间</param>
  51.         /// <returns></returns>
  52.         public override object Add(string key, object entry, DateTime utcExpiry)
  53.         {
  54.             var path = GetPathFromKey(key);
  55.             // 指定的 key 已被缓存了,则不做任何处理
  56.             if (File.Exists(path))
  57.                 return entry;
  58.             // 将对象缓存到硬盘上的指定文件
  59.             using (var file = File.OpenWrite(path))
  60.             {
  61.                 var item = new CacheItem { Expires = utcExpiry, Item = entry };
  62.                 var formatter = new BinaryFormatter();
  63.                 formatter.Serialize(file, item);
  64.             }
  65.             return entry;
  66.         }
  67.         /// <summary>
  68.         /// 在缓存中,根据指定的 key 获取缓存对象
  69.         /// </summary>
  70.         /// <param name="key">缓存 key</param>
  71.         /// <returns></returns>
  72.         public override object Get(string key)
  73.         {
  74.             var path = GetPathFromKey(key);
  75.             // 未找到缓存
  76.             if (!File.Exists(path))
  77.                 return null;
  78.             CacheItem item = null;
  79.             // 如果有缓存的话,则取出缓存对象
  80.             using (var file = File.OpenRead(path))
  81.             {
  82.                 var formatter = new BinaryFormatter();
  83.                 item = (CacheItem)formatter.Deserialize(file);
  84.             }
  85.             // 缓存过期或缓存中无数据,则删除此缓存所对应的硬盘上的物理文件
  86.             if (item == null || item.Expires <= DateTime.Now.ToUniversalTime())
  87.             {
  88.                 Remove(key);
  89.                 return null;
  90.             }
  91.             return item.Item;
  92.         }
  93.         /// <summary>
  94.         /// 根据指定的 key 删除缓存对象
  95.         /// </summary>
  96.         /// <param name="key">缓存 key</param>
  97.         public override void Remove(string key)
  98.         {
  99.             var path = GetPathFromKey(key);
  100.             if (File.Exists(path))
  101.                 File.Delete(path);
  102.         }
  103.         /// <summary>
  104.         /// 更新缓存
  105.         /// </summary>
  106.         /// <param name="key">缓存 key</param>
  107.         /// <param name="entry">缓存对象</param>
  108.         /// <param name="utcExpiry">缓存的过期时间</param>
  109.         public override void Set(string key, object entry, DateTime utcExpiry)
  110.         {
  111.             var item = new CacheItem { Expires = utcExpiry, Item = entry };
  112.             var path = GetPathFromKey(key);
  113.             using (var file = File.OpenWrite(path))
  114.             {
  115.                 var formatter = new BinaryFormatter();
  116.                 formatter.Serialize(file, item);
  117.             }
  118.         }
  119.         /// <summary>
  120.         /// 封装了需要被缓存的对象的一个可序列化的对象
  121.         /// </summary>
  122.         [Serializable]
  123.         internal class CacheItem
  124.         {
  125.             /// <summary>
  126.             /// 缓存对象
  127.             /// </summary>
  128.             public object Item;
  129.            
  130.             /// <summary>
  131.             /// 缓存对象的过期时间
  132.             /// </summary>
  133.             public DateTime Expires;
  134.         }
  135.     }
  136. }
  137. Web.config
  138.   代码
  139. <!--缓存配置-->
  140. <caching>
  141.     <!--默认的缓存实现是 AspNetInternalProvider(即 asp.net 自带的基于内存的缓存实现方式)-->
  142.     <outputCache defaultProvider="AspNetInternalProvider">
  143.         <providers>
  144.             <!--
  145.                 新增一个缓存的 provider 配置
  146.                 具体实现见 CachingEnhancement.aspx.cs
  147.             -->
  148.             <add name="FileCache" type="AspDotNet.FileCacheProvider, AspDotNet"/>
  149.         </providers>
  150.     </outputCache>
  151. </caching>

 

 

 

Global.asax.cs

 

代码

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.SessionState;
  7. using System.Web.Routing;
  8. namespace AspDotNet
  9. {
  10.     public class Global : System.Web.HttpApplication
  11.     {
  12.         // 根据 HttpContext 的不同,可以为其指定不同的 CacheProvider
  13.         public override string GetOutputCacheProviderName(HttpContext context)
  14.         {
  15.             // 符合此条件的,则缓存的实现使用自定义的 FileCacheProvider
  16.             // 自定义缓存实现见 CachingEnhancement.aspx.cs
  17.             // CacheProvider 的配置见 web.config
  18.             // 页面的缓存时间见 CachingEnhancement.aspx
  19.             if (context.Request.Path.ToLower().EndsWith("cachingenhancement.aspx"))
  20.                 return "FileCache";
  21.             else
  22.                 return base.GetOutputCacheProviderName(context);
  23.         }
  24.     }
  25. }

 

 

 

3、表达式 <%: expression %> demo

 

HtmlEncodedCodeExpressions.aspx

 

代码

 

  1. <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
  2.     CodeBehind="HtmlEncodedCodeExpressions.aspx.cs" Inherits="AspDotNet.HtmlEncodedCodeExpressions" %>
  3. <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
  4. </asp:Content>
  5. <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  6.    
  7.     <%--
  8.         新增的一个表达式 <%: expression %> 相当于 <%= HttpUtility.HtmlEncode(expression) %>
  9.     --%>
  10.     <%= "<strong>strong</strong>" %>
  11.     <br />
  12.     <%: "<strong>strong</strong>" %>
  13.     <br />
  14.     <%= HttpUtility.HtmlEncode("<strong>strong</strong>") %>
  15. </asp:Content>

 

 

 

4QueryExtender 控件的 demo

 

QueryExtenderDemo.aspx

 

代码

 

  1. <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
  2.     CodeBehind="QueryExtenderDemo.aspx.cs" Inherits="AspDotNet.QueryExtenderDemo" %>
  3. <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
  4. </asp:Content>
  5. <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  6.     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="LinqDataSource1">
  7.         <Columns>
  8.             <asp:BoundField DataField="ProductId" HeaderText="ProductId" SortExpression="ProductId" />
  9. <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" />
  10.             <asp:BoundField DataField="ProductPrice" HeaderText="ProductPrice" SortExpression="ProductPrice" />
  11.         </Columns>
  12.     </asp:GridView>
  13.     <asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="AspDotNet.QueryExtenderDemo"
  14.         EntityTypeName="AspDotNet.Product" TableName="Data">
  15.     </asp:LinqDataSource>
  16.     <!--
  17.         QueryExtender - 和数据源控件结合使用,以对数据源控件中检索到的数据做再次检索
  18.             SearchExpression - 根据指定的字段查找指定的数据
  19.             RangeExpression - 在指定字段中查找指定范围的数据
  20.             PropertyExpression - 查找某字段的值为某指定的值的数据
  21.             OrderByExpression - 用于排序数据
  22.             CustomExpression - 自定义查询表达式
  23.     -->
  24.     <asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="LinqDataSource1">
  25.         <asp:SearchExpression DataFields="ProductName" SearchType="EndsWith">
  26.             <asp:Parameter Type="String" DefaultValue="0" />
  27.         </asp:SearchExpression>
  28.     </asp:QueryExtender>
  29. </asp:Content>
  30. QueryExtenderDemo.aspx.cs
  31.   代码
  32. using System;
  33. using System.Collections.Generic;
  34. using System.Linq;
  35. using System.Web;
  36. using System.Web.UI;
  37. using System.Web.UI.WebControls;
  38. namespace AspDotNet
  39. {
  40.     public partial class QueryExtenderDemo : System.Web.UI.Page
  41.     {
  42.         protected void Page_Load(object sender, EventArgs e)
  43.         {
  44.         }
  45.         // 为 GridView 提供数据
  46.         public List<Product> Data
  47.         {
  48.             get
  49.             {
  50.                 Random random = new Random();
  51.                 List<Product> products = new List<Product>();
  52.                 for (int i = 0; i < 100; i++)
  53.                 {
  54.                     products.Add(new Product { ProductId = i + 1, ProductName = "名称" + i.ToString().PadLeft(2, '0'), ProductPrice = random.NextDouble() });
  55.                 }
  56.                 return products;
  57.             }
  58.         }
  59.         // 为 GridView 提供数据的实体类
  60.         public class Product
  61.         {
  62.             public int ProductId { get; set; }
  63.             public string ProductName { get; set; }
  64.             public double ProductPrice { get; set; }
  65.         }
  66.     }
  67. }

 

 

 

5、其他新特性的简单说明

 

Others.aspx

 

代码

 

  1. <%@ Page Title="其它,一笔带过" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
  2.     CodeBehind="Others.aspx.cs" Inherits="AspDotNet.Others" %>
  3. <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
  4.     <style>
  5.         body
  6.         {
  7.             font-size: 12px;
  8.         }
  9.         textarea
  10.         {
  11.             width: 99%;
  12.         }
  13.     </style>
  14. </asp:Content>
  15. <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  16.     <p>
  17.         1、Permanent Redirect - 可以实现 301 跳转
  18.         <ul>
  19.             <li>Response.RedirectPermanent() - 永久性重定向(http 301)。</li>
  20.             <li>Response.Redirect() - 临时性重定向(http 302)。</li>
  21.         </ul>
  22.     </p>
  23.     <p>
  24.         2、Session 压缩(设置 sessionState 节点的 compressionEnabled 属性)
  25.         <br />
  26.         对于使用进程外会话状态服务器的会话状态提供程序,或者将会话状态保存在 sqlserver 数据库中的会话状态提供程序,现在为提高其效率新增了压缩 Session 数据的功能(使用System.IO.Compression.GZipStream来压缩数据),像如下这样的配置
  27.         <br />
  28.         <textarea rows="6">
  29.             <sessionState
  30.               mode="SqlServer"
  31.               sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate"
  32.               allowCustomSqlDatabase="true"
  33.               compressionEnabled="true"
  34.             />
  35.         </textarea>
  36.     </p>
  37.     <p>
  38.         3、httpRuntime 节点的新增配置
  39.         <ul>
  40.             <li>maxRequestPathLength - url 路径的最大长度(基于NTFS文件路径的最大长度就是 260)</li>
  41.             <li>maxQueryStringLength - url 的最大长度</li>
  42.             <li>requestPathInvalidChars - 指定 url 路径的无效字符</li>
  43.             <li>requestValidationType - 继承 System.Web.Util.RequestValidator 抽象类,重写其 IsValidRequestString() 方法,以实现自定义的请求验证。在 requestValidationType 可以指定使用这个自定义的类</li>
  44.             <li>encoderType - 重写 System.Web.Util.HttpEncoder,可以实现自定义的 html编码, url编码, http header编码。在 encoderType 指定这个自定义编码的类后,程序中所用到的 System.Web.HttpUtility 或 System.Web.HttpServerUtility 的相关方法将会使用自定义的编码实现</li>
  45.         </ul>
  46.         <br />
  47.         <textarea rows="2">
  48.             <httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" requestPathInvalidChars="&lt;,&gt;,*,%,&amp;,:,\,?" requestValidationType="Samples.MyValidator, Samples" encoderType="Samples.MyEncoder, Samples" />
  49.         </textarea>
  50.     </p>
  51.     <p>
  52.         4、compilation 节点新增 targetFramework 属性,用于指定程序运行的目标框架
  53.         <br />
  54.         <textarea>
  55.             <compilation targetFramework="4.0" />
  56.         </textarea>
  57.     </p>
  58.     <p>
  59.         5、asp.net 4.0 结合 iis 7.5 可使 web 应用程序自动启动
  60.         <br />
  61.         在 web 程序中实现 System.Web.Hosting.IProcessHostPreloadClient 接口,用于被 iis 启动
  62.     </p>
  63.     <p>
  64.         6、Page 类中新增了两个属性,分别是 MetaDescription 和 MetaKeywords
  65.     </p>
  66.     <p>
  67.         7、以前每个可显示的控件都有 Enabled 属性(如果 Enabled="false" 则对应的 HTML 为 disabled="disabled"),但是 HTML 4.01 的标准是只有 input 才能有 disabled 属性
  68.         <ul>
  69.             <li>
  70.                 在 pages 节点中设置 controlRenderingCompatibilityVersion="3.5",则所有可显示控件都会输出 disabled="disabled"
  71.             </li>
  72.             <li>
  73.                 在 pages 节点中设置 controlRenderingCompatibilityVersion="4.0",则只有 input 元素才会输出 disabled="disabled",非 input 元素将会自动标记一个名为 aspnetdisabled 的 css 类
  74.             </li>
  75.         </ul>
  76.     </p>
  77.     <p>
  78.         8、web form 需要在页面上写入隐藏域(如为了保存 ViewState 的隐藏域),在 asp.net 4.0 中系统将在这类的隐藏域外的 div 上标记一个名为 aspNetHidden 的 css 类,以方便样式控制
  79.     </p>
  80.     <p>
  81.         9、ASP.NET Chart Control - 实例参考 http://code.msdn.microsoft.com/mschart
  82.     </p>
  83. </asp:Content>

 

转载于:https://www.cnblogs.com/xiacao/archive/2012/03/07/2382994.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值