天天看點

Dot Net FrameWork 4.0 學習筆記(2)

   這兩天太忙了,沒有時間繼續更新這學習筆記了,每天都要熬到10點鐘才下班,現在我已經就在打哈欠了...還是趕緊寫完眯覺覺吧...     

    這一章照舊就是webform的更新變化來說的,,廢話不說,,let's go

    1,在webform中做url路由

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

    3,新增的表達式<%: expression %>相當于<%= HttpUtility.HtmlEncode(expression) %>

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

    5.其他新特性一覽

    1,在mvc中我們采用routing的方式為我們的控制器與視圖之間搭載了溝通橋梁,在webform中我們亦然可以如此來做

    在webform中使用routing步驟如下:

    (1) 在Global.asax的Application_Start方法中注冊routeTable資訊

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

    (2) 在machine.config中注冊routing類的資訊

    <system.web>

    <!--httpModules注冊攔截類-->

    <httpModules>

      <add name="RoutingModule" type="System.Web.Routing.UrlRoutingModule" />

    </httpModules>

    <compilation debug="true" targetFramework="4.0">

      <expressionBuilders>

        <!--路由比對驗證類,是為了檢查以下應用時的參數是否比對問題啦-->

        <add expressionPrefix="RouteValue" type="System.Web.Compilation.RouteValueExpressionBuilder" />

        <add expressionPrefix="RouteUrl" type="System.Web.Compilation.RouteUrlExpressionBuilder"/>

      </expressionBuilders>

    </compilation>

  </system.web>

  (3) 背景取值應用route資訊

    if (RouteData.Values["userName"] != null)

    {

            // 擷取 url 路由而來的資料  配合以下邏輯的路由規則是:"{userName}/{age}"

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

            Response.Write("<br />");

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

    }

   當然前台也是可以擷取的

   <asp:Label ID="lbl" runat="server" Text="<%$ RouteValue:userName %>"></asp:Label>

    如果面臨以下的寫法:

   <asp:HyperLink ID="hyl1" runat="server" NavigateUrl="<%$ RouteUrl:RouteName=myRoute,userName=zhangsan,age=30,sex=男,class=101班 %>">連結1</asp:HyperLink>

    則其他的參數資訊就變成與配置路由參數隻外的傳值資訊了,可以使用queryString來擷取值了

    2.CacheProvider頁面自定義緩存,在3.5時,我們可以做的頁面緩存方式比較多,但都不夠定制化,4.0中這一現象得到改善

    使用步驟如下:

    (1) 在web頁面上填寫輸出緩存标記

    <%@ OutputCache Duration="30" VaryByParam="None" %>

    (2) 由于目前outputcache不支援providerName屬性直接關聯自定義緩存邏輯類,是以第二步我們必須在web.config的

<system.web>節點裡注冊我們的cacheproviderClass類

    <!--緩存配置-->

        <caching>

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

            <outputCache defaultProvider="AspNetInternalProvider">

                <providers>

                    <!--新增一個緩存的 provider 配置-->

                    <add name="ACache" type="WebApplication4_2.ACacheProvider, WebApplication4_2"/>

                    <add name="BCache" type="WebApplication4_2.BCacheProvider, WebApplication4_2"/>

                </providers>

            </outputCache>

        </caching>

    (3) CacheProvider類中我們需要實作緩存邏輯,此類需要繼承OutputCacheProvider并重寫Add,Get,Remove,Set 略

    可以在這幾個方法中實作你的緩存邏輯,,需要主要緩存内容為二進制形式,需要使用對應類型來儲存反序列化後的結果

    (4) 在Global.asax中重寫GetOutputCacheProviderName利用此方法的上下文(HttpContext)參數來判斷我們業務中具

體需要什麼緩存邏輯

    public override string GetOutputCacheProviderName(HttpContext context)

        {

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

            {

                return "ACache";

            }

            else if (context.Request.Path.ToLower().EndsWith("bcaching.aspx"))

                return "BCache";

            else

                return base.GetOutputCacheProviderName(context);

        }

    這樣我們的頁面緩存就做好了,配合我們的緩存邏輯就可以做到自定義緩存了

    3,<%: expression %>表達式,用于防止頁面的跨域腳本攻擊,我們可以為html表單元素編碼簡便的寫法

    <%--

        新增的一個表達式 <%: expression %> 相當于 <%= HttpUtility.HtmlEncode(expression) %>

    --%>

    <%= "<strong>strong</strong>" %>

    <br />

    <%: "<strong>strong</strong>" %>

    <%= HttpUtility.HtmlEncode("<strong>strong</strong>") %>

    4,QueryExtender為資料源進行再次檢索資訊

    <!--

        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>

    這樣我們就可以在業務邏輯發生變化時,友善的改變資料源中的資料資訊了,而可能不需要再次查詢資料庫

    5,其他特性

    (1) Permanent Redirect - 可以實作 301 跳轉

            Response.RedirectPermanent() - 永久性重定向(http 301)    對搜尋引擎友好性操作,也減免了不少安全隐患

            Response.Redirect() - 臨時性重定向(http 302)

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

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

        <sessionState mode="SqlServer" sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate"

allowCustomSqlDatabase="true" compressionEnabled="true" />

    (3) httpRuntime節點的新增配置

        maxRequestPathLength - url 路徑的最大長度(基于NTFS檔案路徑的最大長度就是 260)

        maxQueryStringLength - url 的最大長度

        requestPathInvalidChars - 指定 url 路徑的無效字元

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

        encoderType 重寫 System.Web.Util.HttpEncoder,可以實作自定義的 html編碼,url編碼,http header編碼.

        在encoderType指定這個自定義編碼的類後,程式中所用到的System.Web.HttpUtility或System.Web.HttpServerUtility的相關方法将會使用自定義的編碼實作

        <httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" requestPathInvalidChars="<,>,*,%,&,:,\,?" requestValidationType="Samples.MyValidator,Samples" encoderType="Samples.MyEncoder,Samples" />

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

        <compilation targetFramework="4.0" />

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

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

    (6) Page類中新增了兩個屬性,分别是MetaDescription和MetaKeywords 這是增強seo的表現了

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

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

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

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

    4.0中關于webform的更新大概就在此處了,我們明顯的感覺到了友好的氛圍,無論是web标準,還是seo等等,都是與我們的體驗使用者分不開的.

    下一節: 動态資料(Dynamic Data)增強部分,AJAX 增強,Visual Studio 2010 增強

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

繼續閱讀