日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET 4 和 Visual Studio 2010 Web 开发概述

發(fā)布時(shí)間:2024/4/17 asp.net 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET 4 和 Visual Studio 2010 Web 开发概述 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

聲明:本文是ASP.NET 白皮書 ASP.NET 4 and Visual Studio 2010 Web Development Overview 的閱讀摘要,只是本人的學(xué)習(xí)記錄,并非完整翻譯,僅供參考,由于水平有限,有些翻譯未必準(zhǔn)確。點(diǎn)擊下載PDF文檔。

本文檔提供了 ASP.NET 的許多新特性的概述,它們包含在 .NET Framework 4 和 Visual Studio 2010 中。

目錄

  • 核心服務(wù)
  • Ajax
  • Web Forms
  • ASP.NET MVC
  • 動(dòng)態(tài)數(shù)據(jù)(Dynamic Data)
  • Visual Studio 2010 Web 開發(fā)增強(qiáng)
  • 使用 Visual Studio 2010 進(jìn)行 Web 應(yīng)用程序開發(fā)
  • 1. 核心服務(wù)

    ASP.NET 4 引入了大量特性來增強(qiáng)核心 ASP.NET 服務(wù),例如輸出緩存和會(huì)話狀態(tài)存儲(chǔ)。

    1) Web.config 文件重構(gòu)

    隨著新特性的增加,如 Ajax、路由以及與 IIS 7 的交互,Web.config 文件包含的配置越來越多。在 .NET Framework 4 中,主要的配置元素已經(jīng)移到 machine.config 文件中。這樣 ASP.NET 4 應(yīng)用程序中的 Web.config 文件可以是空的或只包含幾行,即指定要針對(duì)哪個(gè)版本的框架的內(nèi)容:

    <?xml version="1.0"?>
    <configuration>
    <system.web>
    <compilation targetFramework="4.0" />
    </system.web>
    </configuration>

    2) 可擴(kuò)展的輸出緩存

    以前版本的 ASP.NET 要求輸出緩存必須要存儲(chǔ)在內(nèi)存中。

    ASP.NET 4 提供了輸出緩存的可擴(kuò)展能力,可以創(chuàng)建自定義的輸出緩存提供程序。輸出緩存提供程序能夠使用任何存儲(chǔ)機(jī)制來持久化 HTML 內(nèi)容。這樣就為多種持久化機(jī)制創(chuàng)建自定義輸出緩存成為可能,這些機(jī)制包括本地或遠(yuǎn)程磁盤,云存儲(chǔ),以及分布式緩存引擎。

    定義繼承自 System.Web.Caching.OutputCacheProvider 類型的類即可創(chuàng)建自定義輸出緩存提供程序。然后配置 Web.config 文件中的 outputCache 元素,例如:

    <caching>
    <outputCache defaultProvider="AspNetInternalProvider">
    <providers>
    <add name="DiskCache"
    type="Test.OutputCacheEx.DiskOutputCacheProvider, DiskCacheProvider"/>
    </providers>
    </outputCache>

    </caching>

    ASP.NET 4 默認(rèn)使用內(nèi)存中輸出緩存,即 defaultProvider 屬性設(shè)置的 AspNetInternalProvider。

    另外,可以為每個(gè)控件和每個(gè)請(qǐng)求選擇不同的輸出緩存提供程序。例如:

    <%@ OutputCache Duration="60" VaryByParam="None" providerName="DiskCache" %>

    為 HTTP 請(qǐng)求指定不同的輸出緩存需要在 Global.asax 文件中重寫 GetOutputCacheProviderName 方法。例如:

    public override string GetOutputCacheProviderName(HttpContext context)
    {
    if (context.Request.Path.EndsWith("Advanced.aspx"))
    return "DiskCache";
    else
    return base.GetOutputCacheProviderName(context);
    }

    使用這種擴(kuò)展能力,可以追求更積極更智能的輸出緩存策略,比如現(xiàn)在可以在內(nèi)存中緩存最常訪問的前10個(gè)頁面,而更低流量的頁面緩存在磁盤中。此外,還可以為呈現(xiàn)的頁面緩存每個(gè) vary-by 組合,但使用分布式緩存會(huì)導(dǎo)致內(nèi)存消耗從前端 Web 服務(wù)器中卸載。

    3) 自動(dòng)啟動(dòng)的Web應(yīng)用程序

    一些 Web 應(yīng)用程序需要在第一次請(qǐng)求時(shí)加載大量的數(shù)據(jù)或執(zhí)行昂貴的初始化處理。之前要自己想辦法。現(xiàn)在增加了一個(gè)新的具有可伸縮能力的特性,叫做自動(dòng)啟動(dòng)(auto-start),當(dāng) ASP.NET 4 運(yùn)行在 Windows Server 2008 R2 的 IIS 7.5 上時(shí),它能直接解決這樣的場景。自動(dòng)啟動(dòng)為啟動(dòng)應(yīng)用程序池、初始化 ASP.NET 應(yīng)用程序以及接受 HTTP 請(qǐng)求提供了可控制的方法。

    要使用自動(dòng)啟動(dòng)特性,IIS 管理員需要設(shè)置 applicationHost.config 文件中的應(yīng)用程序池:

    <applicationpools>
    <add name="MyApplicationPool" startMode="AlwaysRunning" />
    </applicationpools>

    因?yàn)閱蝹€(gè)的應(yīng)用程序池可以包含多個(gè)應(yīng)用程序,所以需要在 applicationHost.config 文件中為單獨(dú)的應(yīng)用程序進(jìn)行設(shè)定:

    <sites>
    <site name="MySite" id="1">
    <application path="/"
    serviceAutoStartEnabled="true"
    serviceAutoStartProvider="PrewarmMyCache" >
    <!-- Additional content -->
    </application>
    </site>

    </sites>

    <!-- Additional content -->

    <serviceautostartproviders>
    <add name="PrewarmMyCache"
    type="MyNamespace.CustomInitialization, MyLibrary" />
    </serviceautostartproviders>

    當(dāng) IIS 7.5 服務(wù)器是冷啟動(dòng)的,或當(dāng)單獨(dú)的應(yīng)用程序池回收的時(shí)候,IIS 7.5 會(huì)使用 applicationHost.config 文件中的信息來確定哪些 Web 應(yīng)用程序需要自動(dòng)啟動(dòng)。對(duì)每個(gè)標(biāo)記為自動(dòng)啟動(dòng)的應(yīng)用程序,IIS 7.5 會(huì)發(fā)送請(qǐng)求給 ASP.NET 4來啟動(dòng)應(yīng)用程序。ASP.NET 會(huì)實(shí)例化定義在 serviceAutoStartProvider 屬性中的類型然后調(diào)用其公共的入口方法。

    創(chuàng)建一個(gè)托管的自動(dòng)啟動(dòng)類型要實(shí)現(xiàn) IProcessHostPreloadClient 接口,例如:

    public class CustomInitialization : System.Web.Hosting.IProcessHostPreloadClient
    {
    public void Preload(string[] parameters)
    {
    // Perform initialization.
    }
    }

    運(yùn)行在Preload 方法中的初始化代碼返回之后,ASP.NET 應(yīng)用程序就做好準(zhǔn)備處理請(qǐng)求了。

    4) 永久重定向

    從舊的URL轉(zhuǎn)向新URL的傳統(tǒng)方法是使用 Response.Redirect 方法,這個(gè)方法發(fā)出 HTTP 302 Found(臨時(shí)重定向)響應(yīng),這會(huì)導(dǎo)致額外的 HTTP 往返旅程(round trip)。

    ASP.NET 4 添加了新的 RedirectPermanent 輔助方法,可發(fā)出 HTTP 301 Moved Permanently 響應(yīng),例如:

    RedirectPermanent("/newpath/foroldcontent.aspx");

    搜索引擎和其他用戶代理識(shí)別出永久重定向后會(huì)存儲(chǔ)新URL,消除了不必要的往返旅程。

    5) 縮小的會(huì)話狀態(tài)

    ASP.NET 提供兩種跨 Web 群(Web Farm)的默認(rèn)選項(xiàng):一個(gè)是調(diào)用進(jìn)程外會(huì)話狀態(tài)服務(wù)器的會(huì)話狀態(tài)提供程序,另一個(gè)是將數(shù)據(jù)存儲(chǔ)在SQL Server中的會(huì)話狀態(tài)提供程序。兩個(gè)選項(xiàng)都涉及將狀態(tài)信息發(fā)送到 Web 應(yīng)用程序的工作者進(jìn)程外部,會(huì)話狀態(tài)必須要在發(fā)送前進(jìn)行序列化。依賴于開發(fā)人員保存多少信息在會(huì)話狀態(tài)中,序列化的數(shù)據(jù)可能會(huì)迅速變大。

    ASP.NET 4 為兩種進(jìn)程外會(huì)話狀態(tài)提供程序引入了新的壓縮選項(xiàng)。當(dāng)設(shè)置為 true 時(shí),ASP.NET 會(huì)使用 System.IO.Compression.GZipStream 類壓縮或解壓縮序列化的會(huì)話狀態(tài)。

    <sessionState
    mode="SqlServer"
    sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate"
    allowCustomSqlDatabase="true"
    compressionEnabled="true"
    />

    6) 擴(kuò)展允許的URL范圍

    基于 NTFS 文件路徑限制,舊版本的ASP.NET 限制 URL 路徑長度為 260 個(gè)字符。在 ASP.NET 4 中,有選項(xiàng)來增強(qiáng)或減少這個(gè)限制。例如:

    <httpRuntime maxUrlLength="260" maxQueryStringLength="2048" />

    要允許更長或更短的路徑(即URL中不包括協(xié)議、服務(wù)器名和查詢字符串的部分),修改 maxUrlLength 即可。要允許更長或更短的查詢字符串,修改 maxQueryStringLength 的值。

    ASP.NET 4 還提供了檢查 URL 包含字符的配置。當(dāng)發(fā)現(xiàn)URL的路徑部分中的無效字符時(shí),ASP.NET 會(huì)拒絕請(qǐng)求并發(fā)出 HTTP 400 錯(cuò)誤。舊版本限制了一組固定的字符,ASP.NET 4 可以自定義這些字符了:

    <httpRuntime requestPathInvalidChars="&lt;,&gt;,*,%,&amp;,:,\,?" />

    注意 ASP.NET 4 總量會(huì)拒絕包含 ASCII 碼范圍在 0x00 到 0x1F 之間的字符的 URL 路徑。因?yàn)檫@些是定義在 RFC 2396 中的無效 URL 字符。在運(yùn)行 IIS 6 或更高版本的 Windows Server 各個(gè)版本中,http.sys 協(xié)議設(shè)備驅(qū)動(dòng)程序會(huì)自動(dòng)地拒絕帶有這些字符的 URL。

    7) 可擴(kuò)展的請(qǐng)求驗(yàn)證

    ASP.NET 請(qǐng)求驗(yàn)證會(huì)搜索進(jìn)來的 HTTP 請(qǐng)求數(shù)據(jù)中用于跨站點(diǎn)腳本(XSS,cross-site scripting)攻擊的字符串。如果找到,請(qǐng)求驗(yàn)證會(huì)標(biāo)出可疑腳本并返回錯(cuò)誤。內(nèi)置的請(qǐng)求驗(yàn)證僅當(dāng)發(fā)現(xiàn)了最常見的XSS攻擊字符串時(shí)都會(huì)錯(cuò)誤。

    在 ASP.NET 4 中,請(qǐng)求驗(yàn)證特性可以進(jìn)行擴(kuò)展了,這樣可以使用自定義的請(qǐng)求驗(yàn)證邏輯。要擴(kuò)展請(qǐng)求驗(yàn)證邏輯,可以創(chuàng)建繼承自新的 System.Web.Util.RequestValidator 類型的類,然后配置應(yīng)用程序使用自定義類型。例如:

    <httpRuntime requestValidationType="Samples.MyValidator, Samples" />

    對(duì)每個(gè)請(qǐng)求,ASP.NET 都會(huì)調(diào)用自定義類型去處理每段進(jìn)入的 HTTP 請(qǐng)求數(shù)據(jù)。進(jìn)入的 URL,所有的 HTTP 頭(cookies 和 自定義頭),以及實(shí)體主體對(duì)自定義請(qǐng)求驗(yàn)證類都可拿來檢查。這樣的類定義如下所示:

    public class CustomRequestValidation : RequestValidator
    {
    protected override bool IsValidRequestString(
    HttpContext context, string value,
    RequestValidationSource requestValidationSource,
    string collectionKey,
    out int validationFailureIndex)
    {...}
    }

    8) 對(duì)象緩存和對(duì)象緩存擴(kuò)展

    從初次發(fā)布起,ASP.NET 就包含了強(qiáng)大的內(nèi)存中對(duì)象緩存(System.Web.Caching.Cache)。緩存實(shí)現(xiàn)已經(jīng)變得非常游行以至于它也被用于非 Web 應(yīng)用程序。然而對(duì)于 Windows 窗體或 WPF 來說包含對(duì) System.Web.dll 的引用而只是想使用 ASP.NET 對(duì)象緩存很不合適。

    為了讓所有應(yīng)用程序都能用到緩存,.NET Framework 4 引入了新的程序集,新的全名空間,一些基類型,和具體的緩存實(shí)現(xiàn)。新的 System.Runtime.Caching.dll 程序集包含了 System.Runtime.Caching 全名空間中的新的緩存 API。全名空間包含兩個(gè)核心的類集合:

    • 抽象類型提供生成任何類型的自定義緩存實(shí)現(xiàn)的基礎(chǔ)
    • 一個(gè)具體的內(nèi)存中對(duì)象緩存實(shí)現(xiàn)(System.Runtime.Caching.MemoryCache 類)

    新的 MemoryCache 類接近于 ASP.NET 緩存,它和 ASP.NET 共享了許多內(nèi)部緩存邏輯。盡管 System.Runtime.Caching 中的公共緩存 API 已經(jīng)更新來支持自定義緩存的開發(fā),如果你使用過 ASP.NET Cache 對(duì)象,你會(huì)發(fā)現(xiàn)在 API 中的概念是相似的。

    下面的示例提供了新的緩存API是如何工作的思路,這個(gè)示例是為 Windows 窗體編寫的,沒有依賴于 System.Web.dll。

    private void btnGet_Click(object sender, EventArgs e)
    {
    //Obtain a reference to the default MemoryCache instance.
    //Note that you can create multiple MemoryCache(s) inside
    //of a single application.
    ObjectCache cache = MemoryCache.Default;

    //In this example the cache is storing the contents of a file string
    fileContents = cache["filecontents"] as string;

    //If the file contents are not currently in the cache, then
    //the contents are read from disk and placed in the cache.
    if (fileContents == null)
    {
    //A CacheItemPolicy object holds all the pieces of cache
    //dependency and cache expiration metadata related to a single
    //cache entry.
    CacheItemPolicy policy = new CacheItemPolicy();

    //Build up the information necessary to create a file dependency.
    //In this case we just need the file path of the file on disk.
    List filePaths = new List();
    filePaths.Add("c:\\data.txt");

    //In the new cache API, dependencies are called "change monitors".
    //For this example we want the cache entry to be automatically expired
    //if the contents on disk change. A HostFileChangeMonitor provides
    //this functionality.
    policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));

    //Fetch the file's contents
    fileContents = File.ReadAllText("c:\\data.txt");

    //And then store the file's contents in the cache
    cache.Set("filecontents", fileContents, policy);

    }
    MessageBox.Show(fileContents);
    }

    9) 可擴(kuò)展的 HTML, URL, 和 HTTP 頭編碼

    在 ASP.NET 4 中,可以為下列通用的文本編碼任務(wù)創(chuàng)建自定義編碼例程:

    • HTML 編碼
    • URL 編碼
    • HTML 屬性編碼
    • 編碼出站(outbound)的 HTTP 頭

    通過從新的 System.Web.Util.HttpEncoder 類型派生,可以創(chuàng)建自定義編碼器,然后配置 ASP.NET 使用這個(gè)自定義類型,例如:

    <httpRuntime encoderType="Samples.MyCustomEncoder, Samples" />

    配置好之后,無論何時(shí) System.Web.HttpUtility 或 System.Web.HttpServerUtility 類的公開編碼方法被調(diào)用,ASP.NET 都會(huì)自動(dòng)調(diào)用自定義編碼實(shí)現(xiàn)。

    10) 對(duì)單個(gè)工作者進(jìn)程中獨(dú)立應(yīng)用程序的性能監(jiān)視

    為了在一個(gè)單獨(dú)的服務(wù)器上能夠運(yùn)行更多的 Web 站點(diǎn),許多主機(jī)在單個(gè)工作者進(jìn)程中運(yùn)行多個(gè) ASP.NET 應(yīng)用程序。然而,如果多個(gè)應(yīng)用程序使用單個(gè)共享的工作者進(jìn)程,對(duì)服務(wù)器管理員來說標(biāo)識(shí)出有問題的獨(dú)立應(yīng)用程序是很困難的。

    ASP.NET 4 調(diào)節(jié)了由 CLR 引入的新的資源監(jiān)視功能。要啟用這個(gè)功能,可以添加下列的 XML 配置片斷到 aspnet.config 配置文件中:

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
    <runtime>
    <appDomainResourceMonitoring enabled="true"/>
    </runtime>

    </configuration>

    注意 aspnet.config 文件位于 .NET Framework 的安裝目錄,不是 Web.config 文件。

    啟用之后,兩個(gè)新的性能計(jì)數(shù)器在“ASP.NET 應(yīng)用程序”性能分類中就可用了:% Managed Processor Time 和 Managed Memory Used。這兩個(gè)性能計(jì)數(shù)器使用 CLR 新的應(yīng)用程序域資源管理特性來追蹤估算的 CPU 時(shí)間和單獨(dú)的 ASP.NET 應(yīng)用程序的托管內(nèi)存利用。

    11) 多目標(biāo)

    可以創(chuàng)建針對(duì)特定版本 .NET Framework 的應(yīng)用程序。如果你顯式地針對(duì) .NET Framework 4,如果在 Web.config 文件包含了可選的元素,如對(duì) system.codedom 的條目,這些元素必須是正確的對(duì) .NET Framework 4 的。(如果沒有顯式地針對(duì) .NET Framework 4,目標(biāo)框架會(huì)進(jìn)行推斷)。示例:

    <compilation targetFramework="4.0"/>

    注意下列針對(duì)特定版本的 .NET Framework 的事項(xiàng):

    • 在 .NET Framework 4 應(yīng)用程序池中,如果 Web.config 文件中沒有包含 targetFramework 屬性或者缺少 Web.config 文件,ASP.NET 生成系統(tǒng)會(huì)假設(shè) .NET Framework 4 是目標(biāo)。(你可能必須修改代碼使應(yīng)用程序運(yùn)行在 .NET Framework 4 中)
    • 如果你包含了 targetFramework 屬性,如果 system.codeDom 元素定義在了 Web.config 文件中,這個(gè)文件必須包含針對(duì) .NET Framework 4 的正確條目。
    • 如果你正在使用 aspnet_compiler 命令預(yù)編譯你的應(yīng)用程序(例如在一個(gè)生成環(huán)境),你必須使用針對(duì)目標(biāo)框架的正確版本的 aspnet_compiler 命令。
    • 在運(yùn)行時(shí),編譯器使用安裝在計(jì)算機(jī)中的最新版本的框架程序集(當(dāng)然在GAC中)。如果后來對(duì)框架做了更新(例如,假設(shè)安裝了 4.1 版本),是能夠使用更新版本框架中的特性的,即便 targetFramework 屬性針對(duì)的是更低的版本(例如4.0)。(然而,在 VS2010 的設(shè)計(jì)時(shí)或使用 aspnet_compiler 命令時(shí),使用框架的新特性會(huì)導(dǎo)致編譯器錯(cuò)誤)。

    2. Ajax

    1) jQuery 包含在 Web Forms 和 MVC

    Visual Studio 對(duì) Web Forms 和 MVC 的模板都包含了開源的 jQuery 庫。當(dāng)創(chuàng)建新網(wǎng)站或項(xiàng)目時(shí),一個(gè)包含3個(gè)如下文件的 Scripts 文件夾會(huì)被創(chuàng)建:

    • jQuery-1.4.1.js —— 人類可讀的、未最小化版本的 jQuery 庫
    • jQuery-1.4.1.min.js —— 最小化版本的 jQuery 庫
    • jQuery-1.4.1-vsdoc.js —— 對(duì) jQuery 庫的智能感知文檔文件

    開發(fā)時(shí)包含未最小化版本的 jQuery,對(duì)產(chǎn)品包含最小化版本的 jQuery。

    例如,下面的 Web Forms 頁面演示了如何使用 jQuery 更改 TextBox 控件的背景顏色,使其在獲得焦點(diǎn)時(shí)為黃色:

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ShowjQuery.aspx.cs" Inherits="ShowjQuery" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title>Show jQuery</title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <asp:TextBox ID="txtFirstName" runat="server" />
    <br />
    <asp:TextBox ID="txtLastName" runat="server" />
    </div>
    </form>
    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script> 1:? 2: <script type="text/javascript"> 3: $("input").focus( function() { $(this).css("background-color", "yellow"); }); 4: </script>
    </body>
    </html>

    2) 內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)支持

    Microsoft Ajax 內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network,CDN)使香鍋輕易地添加 ASP.NET Ajax 和 jQuery 腳本到 Web 應(yīng)用程序中。例如:

    <script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.js" type="text/javascript"></script>

    利用 Microsoft Ajax CDN,可以提高 Ajax 應(yīng)用程序的性能。Microsoft Ajax CDN 的內(nèi)容是緩存在世界各地的服務(wù)器上的。另外,Microsoft Ajax CDN 讓瀏覽器能夠?yàn)槎ㄎ辉诓煌蛑械木W(wǎng)站重用緩存的 JavaScript 文件。

    Microsoft Ajax CDN 支持 SSL(HTTPS)。

    要學(xué)習(xí)更多關(guān)于 Microsoft Ajax CDN的內(nèi)容,訪問:http://asp.net/ajaxlibrary/cdn.ashx。

    ASP.NET ScriptManager 支持 Microsoft Ajax CDN。只要簡單地設(shè)置 EnableCdn 屬性就可以了:

    <asp:ScriptManager ID="sm1" EnableCdn="true" runat="server" />

    ASP.NET 框架會(huì)從 CDN 獲取所有的 JavaScript 文件,包括用于驗(yàn)證的和 UpdatePanel 的。

    可以為自己的 JavaScript 文件設(shè)定 CDN 路徑,使用 WebResource 特性就可以實(shí)現(xiàn)。例如:

    [assembly: WebResource("Foo.js", "application/x-javascript", CdnPath = "http://foo.com/foo/bar/foo.js")]

    3) ScriptManager 顯式腳本

    過去,如果你使用 ASP.NET ScriptManager 你需要加載整個(gè)龐大的 ASP.NET Ajax 庫。通過利用新的 ScriptManager.AjaxFrameworkMode 屬性,可以精確地控制 ASP.NET Ajax 庫的哪些組件要加載,只加載需要的組件。

    ScriptManager.AjaxFrameworkMode 屬性可以設(shè)置為以下的值:

    • Enabled——指示 ScriptManager 控件自動(dòng)地包含 MicrosoftAjax.js 腳本文件,這是各個(gè)核心框架腳本的腳本文件組合(遺留行為)。
    • Disabled——指示所有的 Microsoft Ajax 腳本特性都被禁止,ScriptManager 控件不自動(dòng)引用任何腳本。
    • Explicit——指示要顯式地包含頁面需要的單獨(dú)框架核心腳本文件的引用,以及對(duì)腳本文件需要的依賴的引用 。

    例如,如果你設(shè)置 AjaxFrameworkMode 屬性為 Explicit 那么可以指定需要的詳細(xì)的 ASP.NET Ajax 組件腳本:

    <asp:ScriptManager ID="sm1" AjaxFrameworkMode="Explicit" runat="server">

    <Scripts>
    <asp:ScriptReference Name="MicrosoftAjaxCore.js" />
    <asp:ScriptReference Name="MicrosoftAjaxComponentModel.js" />
    <asp:ScriptReference Name="MicrosoftAjaxSerialization.js" />
    <asp:ScriptReference Name="MicrosoftAjaxNetwork.js" />
    </Scripts>
    </asp:ScriptManager>

    3. Web Forms

    Web Forms 從 ASP.NET 1.0 發(fā)布起就是核心特性。在ASP.NET 4 中有許多增強(qiáng),包括:

    • 設(shè)置 meta 標(biāo)簽的能力
    • 對(duì)視圖狀態(tài)更多的控制
    • 使用瀏覽器兼容能力的更簡單的方法
    • 支持對(duì) Web Forms 使用路由
    • 對(duì)產(chǎn)生的ID的更多控制
    • 在數(shù)據(jù)控件中持久化選中行的能力
    • 在 FormView 和 ListView 控件中呈現(xiàn) HTML 的更多控制
    • 對(duì)數(shù)據(jù)源控件的過濾支持

    1) 使用 Page.MetaKeywords 和 Page.MetaDescription 屬性設(shè)置 Meta 標(biāo)記

    ASP.NET 4 給 Paeg 類添加了 2 個(gè)新屬性,MetaKeywords 和 MetaDescription。這兩個(gè)屬性的工作方式和頁面的 Title 屬性工作方式是一樣的。下面是規(guī)則:

    • 如果 head 元素中沒有匹配屬性名的 meta 標(biāo)簽, meta 標(biāo)簽會(huì)在呈現(xiàn)時(shí)添加到頁面上
    • 如果已經(jīng)有 meta 標(biāo)簽,這些屬性作為存在標(biāo)簽內(nèi)容的 get 方法和 set 方法使用

    可以在運(yùn)行時(shí)設(shè)置這些屬性,也可以在 @ Page 指令中設(shè)置。例如:

    <%@ Page Language="C#" AutoEventWireup="true"
    CodeFile="Default.aspx.cs"
    Inherits="_Default"
    Keywords="These, are, my, keywords"
    Description="This is a description" %>

    這會(huì)覆蓋頁面中聲明的 meta 標(biāo)簽內(nèi)容,如果存在的話。

    description meta 標(biāo)簽的內(nèi)容用于提高 Google 的搜索列表預(yù)覽。(見 Improve snippets with a meta description makeover)Google 和 Windows Live Search 都不使用 keywords 的內(nèi)容做任何事情,但其他搜索引擎可能會(huì)。更多信息參見 Meta Keywords Advice。

    2) 為單獨(dú)的控件啟用視圖狀態(tài)

    默認(rèn)地,視圖狀態(tài)是為頁面啟用的,這樣頁面上的每個(gè)控件都可以存儲(chǔ)視圖狀態(tài),即使不需要。視圖狀態(tài)數(shù)據(jù)是包含在頁面生成的標(biāo)記中,會(huì)增加發(fā)送頁面到客戶以及回送的時(shí)間。存儲(chǔ)多于必須的視圖狀態(tài)會(huì)導(dǎo)致明顯的性能退化。舊版本的ASP.NET中,開發(fā)人員可以禁用控件的視圖狀態(tài),但不得不為每個(gè)單獨(dú)的控件設(shè)置。在 ASP.NET 4 中,Web服務(wù)器控件包含了一個(gè) ViewStateMode 屬性來默認(rèn)禁用頁面的視圖狀態(tài)并只為頁面中需要的控件啟用它。

    ViewStateMode 屬性有三個(gè)值:Enabled,Disabled 和 Inherit。Enabled 為控件及其設(shè)置相同屬性為 Inherit 值或不設(shè)置的子控件啟用視圖狀態(tài)。Disabled 禁用視圖狀態(tài),而 Inherit 表示控件使用父控件的 ViewStateMode 值。例如:

    <form id="form1" runat="server">
    <script runat="server"> 1: 2: protected override void OnLoad(EventArgs e) { 3: if (!IsPostBack) { 4: label1.Text = label2.Text = "[DynamicValue]"; 5: } 6: base.OnLoad(e); 7: } 8: </script>
    <asp:PlaceHolder ID="PlaceHolder1" runat="server" ViewStateMode="Disabled">
    Disabled: <asp:Label ID="label1" runat="server" Text="[DeclaredValue]" /><br />
    <asp:PlaceHolder ID="PlaceHolder2" runat="server" ViewStateMode="Enabled">
    Enabled: <asp:Label ID="label2" runat="server" Text="[DeclaredValue]" />
    </asp:PlaceHolder>
    </asp:PlaceHolder>
    <hr />
    <asp:button ID="Button1" runat="server" Text="Postback" />
    <% 1: -- Further markup here -- %>

    可以看到,PlaceHolder1 控件禁用了視圖狀態(tài),子控件 label1 繼承了這個(gè)屬性值(Inherit 是默認(rèn)值),因此不會(huì)保存視圖狀態(tài)。PlaceHolder2 控件 ViewStateMode 設(shè)置為 Enabled,所以 label2 繼承了這個(gè)屬性保存了視圖狀態(tài)。當(dāng)頁面第一次加載時(shí),兩個(gè)標(biāo)簽的 Text 屬性都被設(shè)置為 "[DynamicValue]"。

    然而在 postback 后,label1 顯示 [DeclaredValue],label2 顯示 [DynamicValue]。

    也可以在 @ Page 指令中設(shè)置 ViewStateMode:

    <%@ Page Language="C#" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs"
    Inherits="WebApplication1._Default"
    ViewStateMode="Disabled" %>

    Page 類只不過是另一種控件,它作為頁面中所有其他控件的父控件作用。Page 實(shí)例 ViewSateMode 的默認(rèn)值是 Enabled,控件的默認(rèn)值是 Inherit。

    僅當(dāng) EnableViewState 屬性為 true 時(shí),ViewStateMode 屬性的值才會(huì)決定視圖狀態(tài)是否要維護(hù)。如果 EnableViewState 屬性為 false,視圖狀態(tài)將不會(huì)被維護(hù),即使 ViewStateMode 被設(shè)置為 Enabled。

    一個(gè)良好的使用是在母版頁中使用 ContentPlaceHolder 控件,可以為母版頁把 ViewStateMode 設(shè)置為 Disabled 然后把需要視圖狀態(tài)的 ContentPlaceHolder 控件單獨(dú)啟用它。

    3) 瀏覽器能力的變化

    ASP.NET 通過使用一種叫做瀏覽器能力(browser capabilities)的特性來檢測用戶使用的瀏覽器的能力。瀏覽器能力是通過 HttpBrowserCapabilities 對(duì)象(由 Request.Browser 屬性暴露)來表示的。可以使用 HttpBrowserCapabilities 對(duì)象檢測當(dāng)前瀏覽器是否支持特定版本JavaScript的類型和版本。或者,檢測請(qǐng)求是否最初來自于移動(dòng)設(shè)備。

    HttpBrowserCapabilities 對(duì)象是由一組瀏覽器定義文件驅(qū)動(dòng)的。這些文件包含了關(guān)于特定瀏覽器能力的信息。在 ASP.NET 4 中,這些瀏覽器定義文件已經(jīng)更新為包含最近引入的瀏覽器和設(shè)備(如 Chrome, iPhone)的信息。

    下面的列表展示了新的瀏覽器定義文件:

    • blackberry.browser
    • chrome.browser
    • Default.browser
    • firefox.browser
    • gateway.browser
    • generic.browser
    • ie.browser
    • iemobile.browser
    • iphone.browser
    • opera.browser
    • safari.browser

    使用瀏覽器能力提供程序

    在 ASP.NET 3.5 SP1 中,可以以下面的方法定義瀏覽器擁有的能力:

    a. 在計(jì)算機(jī)級(jí)別,創(chuàng)建或更新下面文件夾中的 .browser XML文件:

    \Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers

    定義后要從 Visual Studio 命令提示行運(yùn)行下面的命令來重新生成瀏覽器能力程序集并將其添加到GAC:

    aspnet_regbrowsers.exe -I c

    b. 對(duì)于單獨(dú)的應(yīng)用程序,在應(yīng)用程序的 App_Browsers 文件夾中創(chuàng)建 .browser 文件。

    這些方法需要更改 XML 文件,對(duì)于計(jì)算機(jī)級(jí)別的更改,還必須在運(yùn)行 aspnet_regbrowsers.exe 后重新啟動(dòng)應(yīng)用程序。

    ASP.NET 4 包含一個(gè)稱為瀏覽器能力提供程序(browser capabilities provider)的特性。正如名稱所示,這個(gè)會(huì)讓你征收一個(gè)提供程序,從而能使用自己的代碼檢測瀏覽器能力。

    在實(shí)踐中,開發(fā)人員經(jīng)常不會(huì)定義自定義的瀏覽器能力。瀏覽器文件很難更新,更新他們的過程相當(dāng)復(fù)雜,而 .browser 文件的 XML 語法復(fù)雜的難以使用和定義。如果有一個(gè)通用的瀏覽器定義語法,或者一個(gè)包含即時(shí)更新瀏覽器定義的數(shù)據(jù)庫,會(huì)不會(huì)讓這個(gè)過程變得容易呢。新的瀏覽器能力提供程序特性讓這些場景成為可能,對(duì)第三方開發(fā)人員也實(shí)用。

    有兩個(gè)使用新的 ASP.NET 4 瀏覽器能力提供程序特性的主要方法:擴(kuò)展 ASP.NET 瀏覽器能力定義功能,或者干脆完全取代它。下面描述如何取代它,再介紹如何擴(kuò)展它。

    a. 取代 ASP.NET 瀏覽器能力功能

    要完全取代 ASP.NET 瀏覽器能力,遵循這些步驟:

    (1) 創(chuàng)建一個(gè)派生自 HttpCapabilitiesProvider 提供程序類重寫 GetBrowserCapabilities 方法,例如:

    public class CustomProvider : HttpCapabilitiesProvider
    {
    public override HttpBrowserCapabilities GetBrowserCapabilities(HttpRequest request)
    {
    HttpBrowserCapabilities browserCaps = new HttpBrowserCapabilities();
    Hashtable values = new Hashtable(180, StringComparer.OrdinalIgnoreCase);
    values[String.Empty] = request.UserAgent;
    values["browser"] = "MyCustomBrowser";
    browserCaps.Capabilities = values;
    return browserCaps;
    }
    }

    代碼創(chuàng)建了一個(gè)新的 HttpBrowserCapabilities 對(duì)象,僅指定了名為 browser 的能力并設(shè)置此能力的值為 MyCustomerBrowser。

    (2) 注冊(cè)提供程序

    為了在應(yīng)用程序中使用提供程序,必須在 Web.config 或 machine.config 文件的 browserCaps 節(jié)添加 provider 屬性。(也可以在 location 元素中為特定目錄定義提供程序?qū)傩?#xff0c;例如針對(duì)特定移動(dòng)設(shè)備的文件夾)。例如:

    <system.web>
    <browserCaps provider="ClassLibrary2.CustomProvider, ClassLibrary2,
    Version=1.0.0.0, Culture=neutral"
    />
    </system.web>

    另一種注冊(cè)方法是使用代碼,例如:

    void Application_Start(object sender, EventArgs e)
    {
    HttpCapabilitiesBase.BrowserCapabilitiesProvider =
    new ClassLibrary2.CustomProvider();
    // ...
    }

    這段代碼必須運(yùn)行在 Global.asax 文件的 Application_Start 事件中。

    b. 緩存 HttpBrowserCapabilities 對(duì)象

    可提升性能,步驟如下:

    (1) 創(chuàng)建一個(gè)派生自 HttpCapabilitiesProvider 的類,例如:

    public class CustomProvider : HttpCapabilitiesProvider
    {
    public override HttpBrowserCapabilities
    GetBrowserCapabilities(HttpRequest request)
    {
    string cacheKey = BuildCacheKey();
    int cacheTime = GetCacheTime();
    HttpBrowserCapabilities browserCaps =
    HttpContext.Current.Cache[cacheKey] as
    HttpBrowserCapabilities;
    if (browserCaps == null)
    {
    HttpBrowserCapabilities browserCaps = new
    HttpBrowserCapabilities();
    Hashtable values = new Hashtable(180,
    StringComparer.OrdinalIgnoreCase);
    values[String.Empty] = request.UserAgent;
    values["browser"] = "MyCustomBrowser";
    browserCaps.Capabilities = values;
    HttpContext.Current.Cache.Insert(cacheKey,
    browserCaps, null, DateTime.MaxValue,
    TimeSpan.FromSeconds(cacheTime));
    }
    return browserCaps;
    }
    }

    (2) 注冊(cè)提供程序(與前面相同)

    c. 擴(kuò)展 ASP.NET 瀏覽器能力功能

    (1) 創(chuàng)建一個(gè)派生自 HttpCapabilitiesEvaluator 的類,重寫 GetBrowserCapabilities 方法,例如:

    public class CustomProvider : HttpCapabilitiesEvaluator
    {
    public override HttpBrowserCapabilities
    GetBrowserCapabilities(HttpRequest request)
    {
    HttpBrowserCapabilities browserCaps =
    base.GetHttpBrowserCapabilities(request);
    if (browserCaps.Browser == "Unknown")
    {
    browserCaps = MyBrowserCapabilitiesEvaulator(request);
    }
    return browserCaps;
    }
    }

    (2) 注冊(cè)提供程序(與前面相同)

    d. 通過添加新的能力給已存在能力定義來擴(kuò)展瀏覽器能力功能

    (1) 創(chuàng)建派生自 HttpCapabilitiesEvaluator 的類,重寫 GetBrowserCapabilities 方法,例如:

    public class CustomProvider : HttpCapabilitiesEvalutor
    {
    public override HttpBrowserCapabilities
    GetBrowserCapabilities(HttpRequest request)
    {
    HttpBrowserCapabilities browserCaps =
    base.GetBrowserCapabilities(request);
    browserCaps.Frames = true;
    browserCaps.Capabilities["MultiTouch"] = "true";
    return browserCaps;
    }
    }

    (2) 注冊(cè)提供程序(與前面相同)

    4) ASP.NET 4 中的路由

    ASP.NET 4 增加了對(duì) Web Forms 使用路由的內(nèi)置支持。路由讓應(yīng)用程序可以配置來接受不映射到物理文件的請(qǐng)求URL。

    路由從 ASP.NET 3.5 SP1 起就可用了,不過 ASP.NET 4 包含了一些更易于使用的特性:

    • PageRouteHandler 類,是一個(gè)簡單的 HTTP 處理程序在定義路由時(shí)使用,該類傳遞數(shù)據(jù)到請(qǐng)求路由的頁面。
    • 新的 HttpRequest.RequestContext 屬性和 Page.RouteData 屬性(這是HttpRequest.RequestContext.RouteData 對(duì)象的代理)。用于更方便的訪問從路由傳遞的信息。
    • 新的表達(dá)式生成器:System.Web.Compilation.RouteUrlExpressionbuilder 和 System.Web.Compilation.RouteValueExpressionBuilder。
    • RouteUrl,提供了一個(gè)在服務(wù)器控件中創(chuàng)建路由URL的簡單方法。
    • RouteValue,提供了從 RouteContext 對(duì)象提取信息的簡單方法。
    • RouteParameter 類,使 RouteContext 對(duì)象中包含的數(shù)據(jù)傳遞到數(shù)據(jù)源控件查詢變得更加容易。

    a. 針對(duì) Web Forms 頁面路由

    下面的例子展示了如何使用 Route 類的新 MapPageRoute 方法定義 Web Forms 路由:

    public class Global : System.Web.HttpApplication
    {
    void Application_Start(object sender, EventArgs e)
    {
    RouteTable.Routes.MapPageRoute("SearchRoute",
    "search/{searchterm}", "~/search.aspx");
    RouteTable.Routes.MapPageRoute("UserRoute",
    "users/{username}", "~/users.aspx");
    }
    }

    ASP.NET 4 引入了 MapPageRoute 方法。下面的例子和前面的例子作用相同,但使用了 PageRouteHandler 類:

    RouteTable.Routes.Add("SearchRoute", new Route("search/{searchterm}",
    new PageRouteHandler("~/search.aspx")));

    代碼將路由映射到物理頁面。第一個(gè)路由定義還指定了名為 searchterm 的參數(shù),它應(yīng)當(dāng)從 URL 中提取并傳遞給頁面。

    MapPageRoute 方法支持下面的方法重載:

    • MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess)
    • MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess, RouteValueDictionary defaults)
    • MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess, RouteValueDictionary defaults, RouteValueDictionary contraints)

    checkPhysicalUrlAccess 參數(shù)指示路由是否應(yīng)當(dāng)檢查被路由的物理頁面(search.aspx)的安全許可,和進(jìn)站URL的許可(search/{searchterm})。如果值為 false,只能進(jìn)站的URL許可會(huì)被檢查。這些許可定義在 Web.config 文件中,例如:

    <configuration>
    <location path="search.aspx">
    <system.web>
    <authorization>
    <allow roles="admin"/>
    <deny users="*"/>
    </authorization>
    </system.web>
    </location>
    <location path="search">
    <system.web>
    <authorization>
    <allow users="*"/>
    </authorization>
    </system.web>
    </location>

    </configuration>

    在示例中,對(duì)物理文件 search.aspx 的訪問對(duì)除了admin角色的其他所有用戶是禁止的。當(dāng) checkPhysicalUrlAccess 參數(shù)為 true (默認(rèn)值)時(shí),只有 admin 用戶允許訪問 URL /search/{searchterm}。如果為 false,所有的授權(quán)用戶都允許訪問 URL /search/{searchterm}。

    b. 在 Web Forms 頁面中讀取路由信息

    在 Web Forms 物理頁面的代碼中,可以訪問從 URL 提取的路由信息(或者其他對(duì)象添加到 RouteData 對(duì)象中的其他信息),這是通過兩個(gè)屬性做到的:HttpRequest.RequestContext 和 Page.RouteData。(Page.RouteData 包裝了 HttpRequest.RequestContext.RouteData)例如:

    protected void Page_Load(object sender, EventArgs e)
    {
    string searchterm = Page.RouteData.Values["searchterm"] as string;
    label1.Text = searchterm;
    }

    考慮這個(gè)請(qǐng)求URL:http://localhost/search/scott,單詞“scott”會(huì)在 search.aspx 頁面中呈現(xiàn)。

    c. 在標(biāo)記中訪問路由信息

    可以在標(biāo)記中使用表達(dá)式訪問路由數(shù)據(jù)。表達(dá)式生成器是一種和聲明式代碼一起工作的強(qiáng)大而優(yōu)雅的方法。(更多信息見 Express Yourself With Custom Expression Builders)。

    ASP.NET 4 為 Web Forms 路由包含兩個(gè)新的表達(dá)式生成器。例如:

    <asp:HyperLink ID="HyperLink1" runat="server"
    NavigateUrl="<%$RouteUrl:SearchTerm=scott%>">Search for Scott</asp:HyperLink>

    在示例中,RouteUrl 用于定義基于路由參數(shù)的 URL。這個(gè)標(biāo)記會(huì)生成這樣的URL:http://localhost/search/scott。

    ASP.NET 基于輸入?yún)?shù)自動(dòng)的解決正確的路由(即產(chǎn)生正確的 URL)。還可以在表達(dá)式中包含路由名稱,這樣可以指定要使用的路由。

    下面的例子展示了如何使用 RouteValue 表達(dá)式,例如:

    <asp:Label ID="Label1" runat="server" Text="<%$RouteValue:SearchTerm%>" />

    當(dāng)包含這個(gè)頁面的控件運(yùn)行時(shí),“scott”會(huì)顯示在標(biāo)簽上。

    RouteValue 表達(dá)式使得在標(biāo)記中使用路由數(shù)據(jù)變得簡單,它避免了在標(biāo)記中使用更復(fù)雜的 Page.RouteData["x"] 語法。

    d. 為數(shù)據(jù)源控件參數(shù)使用路由數(shù)據(jù)

    RouteParameter 類可以指定路由數(shù)據(jù)作為數(shù)據(jù)源控件中查詢的參數(shù)值。例如:

    <asp:sqldatasource id="SqlDataSource1" runat="server"
    connectionstring="<%$ ConnectionStrings:MyNorthwind %>"
    selectcommand="SELECT CompanyName,ShipperID FROM Shippers where
    CompanyName=@companyname"

    &lt;selectparameters>
    <asp:routeparameter name="companyname" RouteKey="searchterm" />
    </selectparameters>

    </asp:sqldatasource>

    5) 設(shè)置客戶 ID

    新的 ClientIDMode 屬性解決了 ASP.NET 的一個(gè)長久的問題,即控件如何為呈現(xiàn)的元素創(chuàng)建 id 屬性。如果應(yīng)用程序包含引用這些元素的客戶腳本時(shí)為呈現(xiàn)的元素生成的 id 屬性就很重要。

    HTML 中為 Web 服務(wù)器控件呈現(xiàn)的的 id 屬性是基于控件的 ClientID 屬性產(chǎn)生的。直到 ASP.NET 4,從 ClientID 產(chǎn)生 id 屬性的算法一直都是使用 ID 連接到命名容器(如果有),這樣對(duì)于反復(fù)控件(repeated controls,即在數(shù)據(jù)控件中),會(huì)添加一個(gè)前綴和一系列連續(xù)的數(shù)字。這就保證了頁面中控件的 ID 是唯一的,算法導(dǎo)致控件 ID 是不可預(yù)知的,因而在客戶腳本中難以引用。

    新的 ClientIDMode 屬性使得可以更精確地指定如何為控件產(chǎn)生客戶 ID。你可以為任何控件設(shè)置 ClientIDMode 屬性,包括頁面。可能的設(shè)置有:

    • AutoID —— 這和舊版本的 ASP.NET 中產(chǎn)生 ClientID 屬性值的算法等價(jià)。
    • Static —— 這表示 ClientID 的值將會(huì)和 ID 的值相同,而不會(huì)連接父級(jí)命名容器的 ID。這對(duì) Web 中的用戶控件是有用的。因?yàn)橐粋€(gè) Web 用戶控件可以放在不同的頁面上以及在不同的容器控件中,對(duì)使用 AutoID 算法的控件編寫客戶腳本是很困難的,因?yàn)椴荒茴A(yù)測 ID 的值。
    • Predictable —— 這個(gè)選項(xiàng)主要用于使用重復(fù)模板的數(shù)據(jù)控件。它連接了控件的命名容器的 ID 屬性,但產(chǎn)生的 ClientID 值不包含類似 "ctlxxx" 的字符串。這個(gè)設(shè)置和控件的 ClientIDRowSuffix 屬性一直工作。設(shè)置 ClientIDRowSuffix 屬性給數(shù)據(jù)字段的名稱,這個(gè)字段的值用作產(chǎn)生的 ClientID 值的后綴。通常使用數(shù)據(jù)記錄的主鍵作為 ClientIDRowSuffix 值。
    • Inherit —— 這個(gè)設(shè)置是控件的默認(rèn)行為,它表示控件的 ID 產(chǎn)生和它的父容器相同。

    可以在頁面級(jí)別設(shè)置 ClientIDMode,這樣就把當(dāng)前頁面中所有的控件定義了默認(rèn)的 ClientIDMode 值。

    在頁面級(jí)別的默認(rèn)的 ClientIDMode 值是 AutoID,控件級(jí)別默認(rèn)的 ClientIDMode 值是 Inherit。

    在 @ Page 指令中設(shè)置頁面級(jí)別的值,例如:

    <%@ Page Language="C#" AutoEventWireup="true"
    CodeFile="Default.aspx.cs"
    Inherits="_Default"
    ClientIDMode="Predictable" %>

    也可以在配置文件中設(shè)置 ClientIDMode 值,或者在計(jì)算機(jī)(機(jī)器)級(jí)別,或者在應(yīng)用程序級(jí)別。這會(huì)在應(yīng)用程序中所有頁面的所有控件定義默認(rèn)的 ClientIDMode 設(shè)置。如果在計(jì)算機(jī)級(jí)別設(shè)置值,就為那臺(tái)計(jì)算機(jī)上所有的網(wǎng)站定義了默認(rèn)的 ClientIDMode 設(shè)置。例如:

    <system.web>
    <pages clientIDMode="Predictable"></pages>
    </system.web>

    ClientID 屬性的值是從控件父控件的命名容器推斷出來的。在某些場景中,例如當(dāng)你使用母版頁時(shí),控件的 ID 可能呈現(xiàn)為下面的 HTML:

    <div id="ctl00_ContentPlaceHolder1_ParentPanel">
    <div id="ctl00_ContentPlaceHolder1_ParentPanel_NamingPanel1">
    <input name="ctl00$ContentPlaceHolder1$ParentPanel$NamingPanel1$TextBox1"
    type="text" value="Hello!"
    id="ctl00_ContentPlaceHolder1_ParentPanel_NamingPanel1_TextBox1" />
    </div>

    盡管標(biāo)記中顯示的 input 元素在頁面中只有兩個(gè)命名容器(嵌套的 ContentPlaceHolder 控件),因?yàn)槟赴骓摰奶幚矸椒?#xff0c;最終結(jié)果是控件的ID會(huì)像這樣:

    ctl00_ContentPlaceHolder1_ParentPanel_NamingPanel1_TextBox1

    這個(gè) ID 保證了在頁面中是唯一的,但在大部分情況下是不必要的。想減少呈現(xiàn)的 ID 的長度,或者想控制 ID 是如何產(chǎn)生的(比如要消除 "ctlxxx" 前綴),最簡單的解決方法是設(shè)置 ClientIDMode 屬性,例如:

    <tc:NamingPanel runat="server" ID="ParentPanel" ClientIDMode="Static">
    <tc:NamingPanel runat="server" ID="NamingPanel1" ClientIDMode="Predictable">
    <asp:TextBox ID="TextBox1" runat="server" Text="Hello!"></asp:TextBox>
    </tc:NamingPanel>

    </tc:NamingPanel>

    在這個(gè)示例中,最外層的 NamingPanel 元素的 ClientIDMode 屬性被設(shè)置為 static,內(nèi)部的 NamingPanel 元素被設(shè)置為 Predictable。這些設(shè)置導(dǎo)致下面的標(biāo)記(頁面的其余部分和母版頁假設(shè)和前面的示例相同):

    <div id="ParentPanel">
    <div id="ParentPanel_NamingPanel1">
    <input name="ctl00$ContentPlaceHolder1$ParentPanel$NamingPanel1$TextBox1"
    type="text" value="Hello!" id="ParentPanel_NamingPanel1_TextBox1" />
    </div>

    Static 的設(shè)置會(huì)影響最外層 NamingPanel 元素內(nèi)部任意控件的命名層次的重新設(shè)置,從產(chǎn)生的 ID 中消除 ContentPlaceHolder 和 MasterPage 的 ID(呈現(xiàn)元素的 name 屬性沒有受到影響,因此對(duì)事件、視圖狀態(tài)等的標(biāo)準(zhǔn) ASP.NET 功能依然保留著)。重新設(shè)置命名層次的一個(gè)副作用是即使你移動(dòng) NamingPanel 元素到不同的 ContentPlaceHolder 控件上,呈現(xiàn)的客戶 ID 和之前相同。

    注意這取決于你來確保呈現(xiàn)的控件 ID 是唯一的。如果不是,會(huì)打斷需要唯一 ID 的功能,例如客戶的 document.getElementById 函數(shù)。

    a. 在數(shù)據(jù)綁定控件中創(chuàng)建可預(yù)測的客戶 ID

    在數(shù)據(jù)綁定的列表控件中通過遺留算法為控件產(chǎn)生的 ClientID 值既長又無法預(yù)測。ClientIDMode 功能可以幫助控制這些 ID 如何產(chǎn)生。

    在下面的示例中包含一個(gè) ListView 控件:

    <asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1"
    OnSelectedIndexChanged="ListView1_SelectedIndexChanged"
    ClientIDMode="Predictable"
    ClientIDRowSuffix="ProductID">
    </asp:ListView>

    標(biāo)記中 ClientIDMode 和 ClientIDRowSuffix 屬性都被設(shè)置了。ClientIDRowSuffix 屬性僅能用于數(shù)據(jù)綁定控件中,它的行為會(huì)因使用的控件而不同。區(qū)別在于:

    • GridView 控件 —— 可以指定數(shù)據(jù)源中一個(gè)或多個(gè)列的名字,它們會(huì)在運(yùn)行時(shí)組合起來創(chuàng)建客戶 ID。例如,如果你設(shè)置 ClientIDRowSuffix 為 "ProductName, ProductId",呈現(xiàn)元素的控件 ID將擁有類似下面的格式:rootPanel_GridView1_ProductNameLabel_Chai_1
    • ListView 控件 —— 可以指定數(shù)據(jù)源中的單個(gè)列追加到客戶 ID。例如,如果你設(shè)置 ClientIDSuffix 為 "ProductName",呈現(xiàn)的控件 ID 將擁有類似這樣的格式:rootPanel_ListView1_ProductNameLabel_1
    • Repeater 控件 —— 這個(gè)控件不支持 ClientIDRowSuffix 屬性。在 Repeater 控件中,使用的是當(dāng)前行的索引。當(dāng)使用 ClientIDMode="Predictable"時(shí),客戶 ID的產(chǎn)生會(huì)有這樣的格式:Repeater1_ProductNameLabel_0

    FormView 和 DetailsView 控件不顯示多行,所以它們不支持 ClientIDRowSuffix 屬性。

    6) 在數(shù)據(jù)控件中持久化行選擇

    GridView 和 ListView 控件能夠讓用戶選擇一行。在舊版本的 ASP.NET 中,選擇是基于頁面上的行索引。例如,如果你選擇了頁面 1 上的第三項(xiàng)然后移動(dòng)到頁面 2,這個(gè)頁面的第三項(xiàng)會(huì)選中。

    持久化選中開始僅在 .NET Framework 3.5 SP1 的動(dòng)態(tài)數(shù)據(jù)(Dynamic Data)項(xiàng)目中支持。當(dāng)這個(gè)特性啟用時(shí),當(dāng)前選中的項(xiàng)是基于項(xiàng)的數(shù)據(jù)鍵。這意味著如果在頁面 1 選中第三行并移到頁面 2,頁面 2 上什么也不會(huì)選中。當(dāng)移回到頁面 1,第三行仍然被選中。通過使用 EnablePersistedSelection 屬性,持久化選中現(xiàn)在在所有項(xiàng)目中支持 GridView 和 ListView 控件,如下所示:

    <asp:GridView id="GridView2" runat="server" EnablePersistedSelection="true">
    </asp:GridView>

    7) ASP.NET Chart 控件

    ASP.NET Chart 控件在 .NET Framework 中擴(kuò)展了數(shù)據(jù)可視化提供。使用 Chart 控件,能夠?yàn)閺?fù)雜的統(tǒng)計(jì)或金融分析創(chuàng)建擁有直覺的和可視化的直觀的圖表的 ASP.NET 頁面。ASP.NET Chart 控件作為 .NET Framework 3.5 SP1 的附加組件引入,現(xiàn)在是 .NET Framework 4 的一部分。

    控件包含下列特性:

    • 35 個(gè)不同的圖表類型
    • 無限數(shù)量的圖表區(qū)域(areas),標(biāo)題,圖例(legends),和標(biāo)注(annotation)
    • 大量的外觀設(shè)置
    • 大多數(shù)圖表類型的3D支持
    • 能自動(dòng)適應(yīng)數(shù)據(jù)點(diǎn)(fit around data points)的智能數(shù)據(jù)標(biāo)簽
    • 帶狀線,刻度中斷和對(duì)數(shù)尺度(Strip lines, scale breaks, and logarithmic scaling)
    • 超過 50 個(gè)金融和統(tǒng)計(jì)公式用于數(shù)據(jù)分析和轉(zhuǎn)換
    • 圖表數(shù)據(jù)的簡單綁定和操縱
    • 支持通用數(shù)據(jù)格式,如日期,時(shí)間,和貨幣
    • 支持交互性和事件驅(qū)動(dòng)的定制,包括使用 Ajax 的客戶單擊事件
    • 狀態(tài)管理
    • 二進(jìn)制流

    下面的圖展示了金融圖表的示例:

    對(duì)于如何使用 Chart 控件的更多示例,可以下載 Samples Environment for Microsoft Char Controls 頁面的示例代碼。在 Chart Control Forum 可以找到更多的示例。

    a. 添加 Chart 控件到 ASP.NET 頁面

    下面的例子展示了如何添加 Chart 控件到 ASP.NET 頁面,在示例中,Chart 控件會(huì)為靜態(tài)數(shù)據(jù)點(diǎn)產(chǎn)生一個(gè)柱狀圖。

    <asp:Chart ID="Chart1" runat="server">
    <Series>
    <asp:Series Name="Series1" ChartType="Column">
    <Points>
    <asp:DataPoint AxisLabel="Product A" YValues="345"/>
    <asp:DataPoint AxisLabel="Product B" YValues="456"/>
    <asp:DataPoint AxisLabel="Product C" YValues="125"/>
    <asp:DataPoint AxisLabel="Product D" YValues="957"/> &

    lt;/Points>
    </asp:Series>
    </Series>
    <ChartAreas>
    <asp:ChartArea Name="ChartArea1">
    <AxisY IsLogarithmic="True" />
    </asp:ChartArea>
    </ChartAreas>
    <Legends>
    <asp:Legend Name="Legend1" Title="Product Sales" />
    </Legends>

    </asp:Chart>

    b. 使用3-D圖表

    Chart 控件包含 ChartAreas 集合,包含定義圖表區(qū)域特征的 ChartArea 對(duì)象。例如,要為圖表區(qū)域使用 3-D,可以像下面的例子那樣使用 Area3DStyle 屬性:

    <asp:ChartArea Name="ChartArea1">
    <area3dstyle
    Rotation="10"
    Perspective="10"
    Enable3D="True"
    Inclination="15"
    IsRightAngleAxes="False"
    WallWidth="0"
    IsClustered="False" />

    <% 1: -- Additional markup here -- %>
    </asp:ChartArea>

    下圖展示了一個(gè)3-D圖表。

    c. 使用刻度中斷和對(duì)數(shù)刻度

    這兩個(gè)特性對(duì)圖表區(qū)域中的每個(gè)軸是特定的。例如,為了在圖表區(qū)域的基本的Y軸使用這些特性,要使用ChartArea 對(duì)象中的AxisY.IsLogarithmic 和 ScaleBreakStyle 屬性。下面的片斷展示了如何在基本Y軸使用刻度中斷:

    <asp:ChartArea Name="ChartArea1">

    <axisy>

    <ScaleBreakStyle
    BreakLineStyle="Wave"
    CollapsibleSpaceThreshold="40"
    Enabled="True" />
    </axisy>
    ...
    </asp:ChartArea>

    下圖展示了效果:

    8) 使用 QueryExtender 控件過濾數(shù)據(jù)

    一個(gè)非常常見的任務(wù)是過濾數(shù)據(jù)。這傳統(tǒng)上是通過在數(shù)據(jù)源控件中生成 Where 子句執(zhí)行的。這個(gè)方法可能很復(fù)雜,有時(shí) Where 語法并不能充分利用底層數(shù)據(jù)庫的全部功能。

    為了使過濾更容易,一個(gè)新的 QueryExtender 控件加入到 ASP.NET 4 中。 這個(gè)控件能夠被添加到 EntityDataSource 或 LinqDataSource 控件中使能夠過濾由這些控件返回的數(shù)據(jù)。因?yàn)?QueryExtender 控件依賴于 LINQ,所以在數(shù)據(jù)發(fā)送到頁面之前,過濾要應(yīng)用到數(shù)據(jù)庫服務(wù)器上,這會(huì)帶來非常高效的操作。

    QueryExtender 控件支持各種各樣的過濾選項(xiàng)。下列幾節(jié)描述這些選項(xiàng)并提供如何使用它們的示例。

    a. 查找(Search)

    對(duì)于查找選項(xiàng),QueryExtender 控件在指定的字段執(zhí)行查找。在下面的例子中,控件使用輸入到 TextBoxSearch 控件中的文本并在從 LinqDataSource 控件返回的數(shù)據(jù)中的 ProductName 和 Supplier.CompanyName 列中查找其內(nèi)容。

    <asp:LinqDataSource ID="dataSource" runat="server"> TableName="Products">
    </asp:LinqDataSource>
    <asp:QueryExtender TargetControlID="dataSource" runat="server">
    <asp:SearchExpression DataFields="ProductName, Supplier.CompanyName"
    SearchType="StartsWith">
    <asp:ControlParameter ControlID="TextBoxSearch" />
    </asp:SearchExpression>
    </asp:QueryExtender>

    b. 范圍(Range)

    范圍選項(xiàng)類似于查找選項(xiàng),但是要指定一對(duì)定義范圍的值。在下面的示例中,QueryExtender 控件查找 LinqDataSource 控件返回?cái)?shù)據(jù)中的 UnitPrice 列。范圍從 TextBoxFrom 和 TextBoxTo 控件讀取。

    <asp:LinqDataSource ID="dataSource" runat="server"> TableName="Products">
    </asp:LinqDataSource>
    <asp:QueryExtender TargetControlID="dataSource" runat="server">
    <asp:RangeExpression DataField="UnitPrice" MinType="Inclusive"
    MaxType="Inclusive">
    <asp:ControlParameter ControlID="TextBoxFrom" />
    <asp:ControlParameter ControlID="TexBoxTo" />
    </asp:RangeExpression>

    </asp:QueryExtender>

    c. 屬性表達(dá)式(PropertyExpression)

    屬性表達(dá)式選項(xiàng)可以定義對(duì)屬性值的比較。如果表達(dá)式演算為 true,那么被檢查的數(shù)據(jù)會(huì)返回。下面的示例中,QueryExtender 控件通過比較 Disontinued 列中的數(shù)據(jù)和來自頁面 CheckBoxDiscontinued 控件的值過濾數(shù)據(jù)。

    <asp:LinqDataSource ID="dataSource" runat="server" TableName="Products">
    </asp:LinqDataSource>
    <asp:QueryExtender TargetControlID="dataSource" runat="server">
    <asp:PropertyExpression>
    <asp:ControlParameter ControlID="CheckBoxDiscontinued" Name="Discontinued" />
    </asp:PropertyExpression>
    </asp:QueryExtender>

    d. 自定義表達(dá)式(CustomExpression)

    這個(gè)選項(xiàng)會(huì)調(diào)用頁面中的函數(shù),此函數(shù)定義了自定義過濾邏輯。下面的示例展示了如何聲明式地指定一個(gè)自定義表達(dá)式。

    <asp:LinqDataSource ID="dataSource" runat="server" TableName="Products">
    </asp:LinqDataSource>
    <asp:QueryExtender TargetControlID="dataSource" runat="server">
    <asp:CustomExpression OnQuerying="FilterProducts" />
    </asp:QueryExtender>

    下面的示例展示了會(huì)被 QueryExtender 控件調(diào)用的自定義函數(shù)。

    protected void FilterProducts(object sender, CustomExpressionEventArgs e)
    {
    e.Query = from p in e.Query.Cast()
    where p.UnitPrice >= 10
    select p;
    }

    這些示例僅展示了在 QueryExtender 控件中一次只使用一種表達(dá)式。然而,你能夠在 QueryExtender 控件內(nèi)部包含多種表達(dá)式。

    9) HTML 編碼的代碼表達(dá)式

    一些 ASP.NET 站點(diǎn)(尤其是使用 ASP.NET MVC)嚴(yán)重依賴使用 <%= expression %> 語法(常稱作"Code nuggets")來編寫一些文本到響應(yīng)。當(dāng)使用代碼表達(dá)式時(shí),很容易就會(huì)忘記 HTML 編碼這些文本,如果文本來自用戶輸入,它可能會(huì)讓頁面對(duì)跨站點(diǎn)腳本(XSS)攻擊開放。

    ASP.NET 4 為代碼表達(dá)式引入了下面的新語法:

    <%: expression %>

    當(dāng)定入到響應(yīng)時(shí),這種語法默認(rèn)使用 HTML 編碼。這種新表達(dá)式實(shí)際會(huì)轉(zhuǎn)換成下面的:

    <%= HttpUtility.HtmlEncode(expression) %>

    例如,<%: Request["UserInput"] %> 會(huì)在 Request["UserInput"] 的值上面執(zhí)行 HTML 編碼。

    這個(gè)特性的目標(biāo)是使得用新語法代替老語法的所有實(shí)例成為可能,這樣就不用強(qiáng)迫在每個(gè)步驟決定要使用哪一個(gè)。然而,有一些情況即正在輸出的文本哪些是 HTML 還是已經(jīng)編碼過了,這會(huì)導(dǎo)致雙重編碼。

    為了解決這些情況,ASP.NET 4 引入了一個(gè)新接口,IHtmlString,和具體實(shí)現(xiàn),HtmlString。這些類型的實(shí)例表示對(duì)要顯示為 HTML 的返回值已經(jīng)恰當(dāng)?shù)鼐幋a了(或另外檢查了),因此值不必在被編碼了。例如,下面不應(yīng)當(dāng)被(也沒被)HTML編碼:

    <% 1: : new HtmlString("<strong>HTML that is not encoded</strong>") %>

    ASP.NET MVC 2 輔助方法已經(jīng)被更新為和這種新語法一起工作這樣就不會(huì)被雙重編碼了,但僅當(dāng)你在運(yùn)行 ASP.NET 4 的時(shí)候。這種新語法在應(yīng)用程序使用 ASP.NET 3.5 SP1 運(yùn)行的時(shí)候是不工作的。

    記住這不保證來自 XSS 攻擊的保護(hù)。例如,使用不包含在引號(hào)中的屬性值的 HTML 能夠包含依然會(huì)受影響的用戶輸入。注意 ASP.NET 控件的輸出和 ASP.NET MVC 輔助方法總是把屬性值包含在引號(hào)中,這是推薦的方法。

    同樣,這種語法不會(huì)執(zhí)行 JavaScript 編碼,例如在基于用戶輸入創(chuàng)建一個(gè) JavaScript 字符串時(shí)。

    10) 項(xiàng)目模板變化

    在舊版本的 ASP.NET 提供的項(xiàng)目模板(一個(gè)空項(xiàng)目模板和一個(gè)僅有默認(rèn)文檔的模板)不利于指導(dǎo)初學(xué)者。因此,ASP.NET 4 引入了三個(gè)新模板,一個(gè)為空 Web 應(yīng)用程序項(xiàng)目,另兩個(gè)為一個(gè) Web 應(yīng)用程序和一個(gè)為網(wǎng)站項(xiàng)目。

    a. 空 Web 應(yīng)用程序模板

    僅有一個(gè) web.config 文件:

    b. Web 應(yīng)用程序和網(wǎng)站項(xiàng)目模板

    項(xiàng)目包含大量文件。另外,Web 應(yīng)用程序項(xiàng)目使用基本的會(huì)員功能進(jìn)行配置,這可以快速地在安全訪問新應(yīng)用程序中開始起動(dòng)。所以 web.config 文件包含了用于配置會(huì)員、角色和profiles的條目。

    項(xiàng)目還在 Account 目錄中包含第二個(gè) Web.config 文件。這第二個(gè)配置文件提供了一種對(duì)非登錄用戶安全訪問 ChangePassword.aspx 頁面的方法。例如:

    默認(rèn)創(chuàng)建的頁面同樣包含很多內(nèi)容。項(xiàng)目包含一個(gè)默認(rèn)的母版頁和 CSS 文件,以及一個(gè)配置為默認(rèn)使用母版頁的默認(rèn)頁面(Default.aspx)。結(jié)果就是當(dāng)你第一次運(yùn)行 Web 應(yīng)用程序或網(wǎng)站時(shí),默認(rèn)頁面(主頁)就已經(jīng)就緒了。事實(shí)上,當(dāng)啟動(dòng)一個(gè)新的 MVC 應(yīng)用程序時(shí)默認(rèn)頁面是相似的。

    項(xiàng)目模板的這些改變的意圖是提供一個(gè)指南,即如何開始構(gòu)建一個(gè)新的 Web 應(yīng)用程序。使用語義正確的,嚴(yán)格遵從 XHTML 1.0 的標(biāo)記和使用 CSS 指定布局,模板中的頁面為構(gòu)建 ASP.NET 4 Web應(yīng)用程序提供了最佳實(shí)踐。

    11) CSS 增強(qiáng)

    ASP.NET 4 中的一個(gè)主要工作方面是幫助呈現(xiàn)遵從最新HTML標(biāo)準(zhǔn)的HTML。這包括ASP.NET Web服務(wù)器控件如何使用 CSS 樣式。

    a. 針對(duì)呈現(xiàn)的兼容性設(shè)置

    默認(rèn)地,當(dāng) Web 應(yīng)用程序或網(wǎng)站針對(duì) .NET Framework 4 時(shí),頁面元素的 controlRenderingCompatibilityVersion 屬性會(huì)設(shè)置為 "4.0"。這個(gè)元素定義在機(jī)器級(jí)別的 Web.config 文件中,默認(rèn)應(yīng)用到所有的 ASP.NET 4 應(yīng)用程序上:

    <system.web>
    <pages controlRenderingCompatibilityVersion="3.5|4.0"/>
    </system.web> controlRenderingCompatibilityVersion 是一個(gè)字符串,在當(dāng)前發(fā)布版本中,支持下列的值:
    • "3.5"。這個(gè)設(shè)置表示遺留的呈現(xiàn)和標(biāo)記。控件呈現(xiàn)的標(biāo)記是100%向后兼容的,而 xhtmlConformance 屬性是承兌的(honored 怎么翻譯?)
    • "4.0"。如果是這個(gè)設(shè)置,ASP.NET 服務(wù)器控件會(huì)做下列事情:
      • xhtmlConformance 屬性總是被視為 "Strict"。
      • 非輸入控件不再呈現(xiàn)無效樣式。
      • 隱藏域周圍的 div 元素現(xiàn)在是有樣式的,這樣它們就不會(huì)妨礙用戶創(chuàng)建的 CSS 規(guī)則。
      • Menu 控件呈現(xiàn)的標(biāo)記是語義正確的而且遵從可訪問性指南。
      • 驗(yàn)證控件不再呈現(xiàn)內(nèi)聯(lián)樣式。
      • 以前會(huì)呈現(xiàn) border="0" 的控件(即從ASP.NET Table 控件和 Image 控件派生的控件)不再呈現(xiàn)這個(gè)屬性。

    b. 禁用控件

    在 ASP.NET 3.5 SP1 和更早版本中,框架會(huì)為任何 Enabled 屬性設(shè)置為 false 的控件在 HTML 中呈現(xiàn) disabled 屬性。然而根據(jù) HTML 4.01 規(guī)范,只有 input 元素才應(yīng)當(dāng)有這個(gè)屬性。

    在 ASP.NET 4 中,可以把 controlRenderingCompatibilityVersion 屬性設(shè)置為 "3.5",例如:

    <system.web>
    <pages controlRenderingCompatibilityVersion="3.5"/>
    </system.web>

    這時(shí)創(chuàng)建一個(gè) Label 控件并禁用此控件,例如:

    <asp:Label id="Label" runat="server" Text="Test" Enabled="false">

    Label 控件會(huì)呈現(xiàn)如下的 HTML:

    <span id="Label1" disabled="disabled">Test</span>

    在 ASP.NET 4 中,可以把 controlRenderingCompatibilityVersion 為 "4.0",這時(shí),當(dāng)控件的 Enabled 屬性設(shè)置為 false 時(shí),只有呈現(xiàn) input 元素的控件才會(huì)呈現(xiàn) disabled 屬性。不呈現(xiàn)為 HTML input 元素的控件則會(huì)呈現(xiàn)一個(gè) class 屬性引用一個(gè) CSS 類,可以用來定義控件的禁用外觀。例如,前面示例中展示的 Label 控件會(huì)產(chǎn)生下面的標(biāo)記:

    <span id="Span1" class="aspnetdisabled">Test</span>

    為這個(gè)控件指定的類的默認(rèn)值是 "aspnetdisabled"。通過設(shè)置 WebControl 類的靜態(tài)屬性 DisabledCssClass 可以更改這個(gè)默認(rèn)值。對(duì)于控件開發(fā)人員,對(duì)特定控件使用的行為也可以使用 SupportsDisabledAttribute 屬性定義。

    12) 隱藏圍繞隱藏域的 DIV 元素

    ASP.NET 2.0 及以后的版本會(huì)把系統(tǒng)指定的隱藏域(例如用于存儲(chǔ)視圖狀態(tài)信息的 hidden 元素)呈現(xiàn)在 div 元素中,這是為了遵從 XHTML 標(biāo)準(zhǔn)。然而,當(dāng) CSS 規(guī)則影響 div 元素時(shí)會(huì)導(dǎo)致問題。例如,它可能在頁面隱藏的 div 元素上顯示 1 像素的線。在 ASP.NET 4 中,包裝了隱藏域的 div 元素會(huì)添加一個(gè) CSS 類引用,如下所示:

    <div class="aspNetHidden">...</div>

    接著可以定義一個(gè) CSS 類只應(yīng)用到隱藏元素。如下面所示:

    <style type="text/css">
    DIV# aspNetHidden {border:0;}

    </style>

    13) 為模板控件呈現(xiàn)外部表格

    默認(rèn)地,下面支持模板的 ASP.NET Web 服務(wù)器控件都會(huì)自動(dòng)地包圍在外部表格的里面并應(yīng)用內(nèi)聯(lián)樣式:

    • FormView
    • Login
    • PasswordRecovery
    • ChangePassword
    • Wizard
    • CreateUserWizard

    一個(gè)新的名為? RenderOuterTable 的屬性添加到這些控件上來允許外部表格從標(biāo)記中移除。例如,考慮下面的 FormView 控件的例子:

    <asp:FormView ID="FormView1" runat="server">
    <ItemTemplate>
    Content
    </ItemTemplate>

    </asp:FormView>

    這個(gè)標(biāo)記會(huì)呈現(xiàn)下面的輸出到頁面,其中包含一個(gè) HTML 表格:

    <table cellspacing="0" border="0" id="Table1" style="border-collapse:collapse;">
    <tr>
    <td colspan="2">
    Content
    </td>
    </tr>

    </table>

    為了阻止表格被呈現(xiàn),可以設(shè)置 FormView 控件的 RenderOuterTable 屬性為 false,如下面所示:

    <asp:FormView ID="FormView1" runat="server" RenderOuterTable="false">

    這時(shí)輸出就不會(huì)有 table, tr, 和 td 元素了,只有模板中的內(nèi)容。

    這個(gè)增強(qiáng)使得使用 CSS 對(duì)內(nèi)容設(shè)置樣式變得更加容易,因?yàn)闆]有未料到的標(biāo)簽被呈現(xiàn)。

    注意這個(gè)變化禁止了對(duì) Visual Studio 2010 設(shè)計(jì)器中的自動(dòng)格式化功能的支持。

    14) ListView 控件增強(qiáng)

    ListView 控件在 ASP.NET 4 中變得更容易使用了。舊版本的這個(gè)控件需要指定一個(gè)布局模板,其中包含一個(gè)規(guī)定 ID 的服務(wù)器控件。下面的例子展示了在 ASP.NET 3.5 中 ListView 的典型示例:

    <asp:ListView ID="ListView1" runat="server">
    <LayoutTemplate>
    <asp:PlaceHolder ID="ItemPlaceHolder" runat="server"></asp:PlaceHolder>
    </LayoutTemplate>
    <ItemTemplate>
    <% 1: Eval("LastName") %>
    </ItemTemplate>
    </asp:ListView>

    在ASP.NET 4中,ListView 控件不再需要布局模板,前面的例子可以由下面的標(biāo)記取代:

    <asp:ListView ID="ListView1" runat="server">
    <ItemTemplate>
    <% 1: Eval("LastName") %>
    </ItemTemplate>
    </asp:ListView>

    15) CheckBoxList 和 RadioButtonList 控件增強(qiáng)

    在 ASP.NET 3.5 中,使用兩個(gè)值(Flow 和 Table)可以為 CheckBoxList 和 RadioButtonList 指定布局。例如:

    <asp:CheckBoxList ID="CheckBoxList1" runat="server" RepeatLayout="Flow">
    <asp:ListItem Text="CheckBoxList" Value="cbl" />
    </asp:CheckBoxList>

    <asp:RadioButtonList runat="server" RepeatLayout="Table">
    <asp:ListItem Text="RadioButtonList" Value="rbl" />
    </asp:RadioButtonList>

    默認(rèn)地,控件會(huì)呈現(xiàn)如下類似的 HTML:

    <span id="Span2"><input id="CheckBoxList1_0" type="checkbox"
    name="CheckBoxList1$0" /><label for="CheckBoxList1_0">CheckBoxList</label></span>

    <table id="RadioButtonList1" border="0">
    <tr>
    <td><input id="RadioButtonList1_0" type="radio" name="RadioButtonList1" value="rbl" /><label for="RadioButtonList1_0">RadioButtonList</label></td>
    </tr>
    </table>

    因?yàn)檫@些控件包含項(xiàng)的列表,要呈現(xiàn)語義正確的 HTML,應(yīng)當(dāng)使用 HTML 列表(li)呈現(xiàn)內(nèi)容。

    在 ASP.NET 4 中,CheckBoxList 和 RadioButtonList 控件的 RepeatLayout 屬性支持兩個(gè)新值:OrderedList 和 UnorderedList。

    下面的例子展示了如何使用這些新值:

    <asp:CheckBoxList ID="CheckBoxList1" runat="server"
    RepeatLayout="OrderedList">
    <asp:ListItem Text="CheckBoxList" Value="cbl" />
    </asp:CheckBoxList>

    <asp:RadioButtonList ID="RadioButtonList1" runat="server"
    RepeatLayout="UnorderedList">
    <asp:ListItem Text="RadioButtonList" Value="rbl" />
    </asp:RadioButtonList>

    產(chǎn)生的HTML:

    <ol id="CheckBoxList1">
    <li><input id="CheckBoxList1_0" type="checkbox" name="CheckBoxList1$0" value="cbl" /><label for="CheckBoxList1_0">CheckBoxList</label></li>
    </ol>

    <ul id="RadioButtonList1">
    <li><input id="RadioButtonList1_0" type="radio" name="RadioButtonList1" value="rbl" /><label for="RadioButtonList1_0">RadioButtonList</label></li>
    </ul>

    注意,如果把 RepeatLayout 設(shè)置為新值,RepeatDirection 屬性就不能再使用,否則會(huì)在運(yùn)行時(shí)拋出異常。這些控件的視覺布局可使用 CSS 定義。

    16) Menu 控件增強(qiáng)

    在 ASP.NET 4 之前,Menu 控件呈現(xiàn)為一系列 HTML 表格。這使得應(yīng)用 CSS 樣式變得很困難,而且也不遵從可訪問性標(biāo)準(zhǔn)。

    在 ASP.NET 4 中,這個(gè)控件現(xiàn)在使用語義標(biāo)記呈現(xiàn),即由一個(gè)無序列表和列表元素組成。下面的例子展示了 Menu 控件在頁面中的標(biāo)記:

    <asp:Menu ID="Menu1" runat="server">
    <Items> <asp:MenuItem Text="Home" Value="Home" />
    <asp:MenuItem Text="About" Value="About" />
    </Items>
    </asp:Menu>

    當(dāng)頁面呈現(xiàn)時(shí),控件會(huì)產(chǎn)生下列 HTML:

    <div id="Menu1">
    <ul>
    <li><a href="#" onclick="...">Home</a></li>
    <li><a href="#" onclick="...">About</a></li>
    </ul>
    </div>
    <script type="text/javascript"> 1: 2: new Sys.WebForms.Menu('Menu1'); </script>

    除了呈現(xiàn)的增強(qiáng),菜單的鍵盤導(dǎo)航也使用焦點(diǎn)管理改進(jìn)了。當(dāng) Menu 控件獲得焦點(diǎn)時(shí),可以使用箭頭鍵導(dǎo)航元素。Menu 控件現(xiàn)在還能附加可訪問富互聯(lián)網(wǎng)應(yīng)用程序(ARIA)角色和屬性,以增強(qiáng)可訪問能力。(見 Menu ARIA guidelines)

    為菜單控件的樣式呈現(xiàn)在頁面頂部的樣式塊中,而不是內(nèi)聯(lián)在呈現(xiàn)的 HTML 元素中。如果想完全控制對(duì)控件的樣式,可以把新的 IncludeStyleBlock 屬性設(shè)置為 false,這會(huì)讓樣式塊不被發(fā)出。另外,可以先運(yùn)行頁面,把呈現(xiàn)的樣式塊復(fù)制到外部 CSS 文件,再把控件的 IncludeStyleBlock 屬性設(shè)置為 false。這樣菜單外觀就被定義到外部樣式表中了。

    17) Wizard 和 CreateUserWizard 控件

    ASP.NET Wizard 和 CreateUserWizard 控件支持模板,用來定義呈現(xiàn)的 HTML。(CreateUserWizard 派生自 Wizard)下面的示例展示了一個(gè)完全模板化的 CreateUserWizard 控件的標(biāo)記:

    <asp:CreateUserWizard ID="CreateUserWizard1" runat="server" ActiveStepIndex="0">
    <HeaderTemplate>
    </HeaderTemplate>

    <SideBarTemplate>
    </SideBarTemplate>

    <StepNavigationTemplate>
    </StepNavigationTemplate>

    <StartNavigationTemplate>
    </StartNavigationTemplate>

    <FinishNavigationTemplate>
    </FinishNavigationTemplate>

    <WizardSteps>
    <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
    <ContentTemplate>
    </ContentTemplate>

    <CustomNavigationTemplate>
    </CustomNavigationTemplate>

    </asp:CreateUserWizardStep>

    <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
    <ContentTemplate>
    </ContentTemplate>
    </asp:CompleteWizardStep>

    </WizardSteps>
    </asp:CreateUserWizard>

    控件呈現(xiàn)類似下面的 HTML:

    <table cellspacing="0" cellpadding="0" border="0" id="CreateUserWizard1" style="border-collapse:collapse;">
    <tr>
    <td>Header</td>
    </tr>
    <tr style="height:100%;">
    <td>
    <table cellspacing="0" cellpadding="0" border="0" style="height:100%;width:100%;border-collapse:collapse;">
    <tr>
    <td style="height:100%;width:100%;"></td>
    </tr>
    </table>
    </td>
    </tr>
    <tr>
    <td align="right"></td>
    </tr>
    </table>

    在 ASP.NET 3.5 SP1 中,盡管可以改變模板的內(nèi)容,但仍然對(duì)控制 Wizard 控件的輸出有限制。在ASP.NET 4中,可以創(chuàng)建一個(gè) LayoutTemplate 模板并插入 PlaceHolder 控件(使用保留的名稱)來指示想讓 Wizard 控件如何呈現(xiàn)。下面的示例展示了這個(gè)過程:

    <asp:CreateUserWizard ID="CreateUserWizard1" runat="server" ActiveStepIndex="1">
    <LayoutTemplate>
    <asp:PlaceHolder ID="headerPlaceholder" runat="server" />
    <asp:PlaceHolder ID="sideBarPlaceholder" runat="server" />
    <asp:PlaceHolder id="wizardStepPlaceholder" runat="server" />
    <asp:PlaceHolder id="navigationPlaceholder" runat="server" />
    </LayoutTemplate>
    <HeaderTemplate>
    Header
    </HeaderTemplate>
    <WizardSteps>
    <asp:CreateUserWizardStep runat="server">
    <ContentTemplate>
    </ContentTemplate>
    </asp:CreateUserWizardStep>
    <asp:CompleteWizardStep runat="server">
    <ContentTemplate>
    </ContentTemplate>
    </asp:CreateUserWizardStep>
    </WizardSteps>
    </asp:CreateUserWizard>

    示例包含了下列在 LayoutTemplate 元素中的命名占位符:

    • headerPlaceHolder——在運(yùn)行時(shí),這會(huì)被 HeaderTemplate 元素中的內(nèi)容取代
    • sideBarPlaceHolder——在運(yùn)行時(shí),這會(huì)被 SideBarTemplate 元素的內(nèi)容取代
    • wizardStepPlaceHolder——在運(yùn)行時(shí),這會(huì)被 WizardStepTemplate 元素的內(nèi)容取代
    • navigationPlaceHolder——在運(yùn)行時(shí),這會(huì)被定義的導(dǎo)航模板所取代

    示例中的標(biāo)記使用占位符呈現(xiàn)了下列的 HTML(定義的模板中沒有實(shí)際定義的內(nèi)容):

    <span>
    </span>

    唯一的不是用戶定義的 HTML 是 span 元素。(我們期望在未來的發(fā)布中,甚至連 span 元素也不會(huì)呈現(xiàn)。)

    4. ASP.NET MVC

    2009年3月,ASP.NET MVC 作為一個(gè)附加框架加入到 ASP.NET 3.5 SP1 中。 Visual Studio 2010 包含了 ASP.NET MVC 2,它包含了新的特性和能力。

    1) Area 支持

    Area 可以把分組的控制器和視圖放到大型應(yīng)用程序的區(qū)域(sections)中,區(qū)域之間是相對(duì)隔離的。每個(gè) area 都可以作為單獨(dú)的 ASP.NET MVC 項(xiàng)目實(shí)現(xiàn),然后由主應(yīng)用程序引用。這樣當(dāng)構(gòu)建一個(gè)大型應(yīng)用程序時(shí)可以幫助管理復(fù)雜性,并使得多個(gè)團(tuán)隊(duì)在一個(gè)應(yīng)用程序上一直工作變得容易了。

    2) 數(shù)據(jù)注解特性驗(yàn)證支持(Data-Annotation Attribute Validation Support)

    DataAnnotations 特性能夠把驗(yàn)證邏輯附加到模型上。DataAnnotations 特性是在 ASP.NET 3.5 SP1 的 ASP.NET 動(dòng)態(tài)數(shù)據(jù)中引入的,這些特性已經(jīng)集成到默認(rèn)的模型綁定器(model binder)上并提供一種元數(shù)據(jù)驅(qū)動(dòng)的驗(yàn)證用戶輸入的方法。

    3) 模板化助手(Templated Helper)

    模板化助手能夠自動(dòng)自動(dòng)地用數(shù)據(jù)類型把編輯和顯示模板關(guān)聯(lián)起來。例如,可以使用模板助手指定為 System.DateTime 值自動(dòng)地呈現(xiàn)一個(gè)日期拾取 UI 元素。這和 ASP.NET 動(dòng)態(tài)數(shù)據(jù)中的字段模板相似。

    Html.EditorFor 和 Html.DisplayFor 助手方法擁有對(duì)呈現(xiàn)標(biāo)準(zhǔn)數(shù)據(jù)類型以及有多個(gè)屬性的復(fù)雜對(duì)象的內(nèi)置支持。它們還可以通過把數(shù)據(jù)注解特性(如 DisplayName 和 ScaffoldColumn)應(yīng)用到 ViewModel 對(duì)象來定制呈現(xiàn)。

    經(jīng)常想更深入地從 UI 助手呈現(xiàn)輸出,并對(duì)產(chǎn)生的內(nèi)容進(jìn)行完全的控制。Html.EditorFor 和 Html.DisplayFor 助手方法使用模板機(jī)制來支持這個(gè)功能,它通過定義外部模板來覆蓋和控制呈現(xiàn)的輸出。模板可以為一個(gè)類單獨(dú)呈現(xiàn)。

    5. 動(dòng)態(tài)數(shù)據(jù)(Dynamic Data)

    動(dòng)態(tài)數(shù)據(jù)是在 2008 年中在 .NET Framework 3.5 SP1 中引入的。這個(gè)特性提供了許多創(chuàng)建數(shù)據(jù)驅(qū)動(dòng)應(yīng)用程序的增強(qiáng)。包括:

    • 一個(gè)為快速構(gòu)建數(shù)據(jù)驅(qū)動(dòng)網(wǎng)站的 RAD 體驗(yàn)
    • 基于數(shù)據(jù)模型中定義的限制的自動(dòng)驗(yàn)證
    • 通過使用字段模板輕易地在 GridView 和 DetailsView 控件中更改為字段產(chǎn)生標(biāo)記的能力。

    更多信息,參見 Dynamic Data 文檔。

    對(duì)于 ASP.NET 4,動(dòng)態(tài)數(shù)據(jù)已經(jīng)對(duì)開發(fā)人員做了增強(qiáng),甚至能夠更加強(qiáng)大地快速構(gòu)建數(shù)據(jù)驅(qū)動(dòng)的網(wǎng)站。

    1) 為現(xiàn)存項(xiàng)目啟用動(dòng)態(tài)數(shù)據(jù)

    .NET Framework 3.5 SP1 中的動(dòng)態(tài)數(shù)據(jù)帶來了以下新特性:

    • 字段模板——這些為數(shù)據(jù)綁定控件提供了基于數(shù)據(jù)類型的模板。字段模板提供了更加簡單的方法來定制數(shù)據(jù)控件的外觀。
    • 驗(yàn)證——?jiǎng)討B(tài)數(shù)據(jù)在數(shù)據(jù)類上使用特性(attribute)來指定驗(yàn)證,這些驗(yàn)證是為通用的場景準(zhǔn)備的,像必填字段,范圍字段,類型檢查,模式匹配(使用正則表達(dá)式),和自定義驗(yàn)證。驗(yàn)證是由數(shù)據(jù)控件實(shí)施的。

    然而,這些特性需要下面的要求:

    • 數(shù)據(jù)訪問層必須基于實(shí)體框架(Entity Framework)或 LINQ to SQL。
    • 支持這些特性的數(shù)據(jù)源控件只有 EntityDataSource 和 LinqDataSource 控件。
    • 需要使用動(dòng)態(tài)數(shù)據(jù)或動(dòng)態(tài)數(shù)據(jù)實(shí)體模板創(chuàng)建的Web項(xiàng)目,才能擁有所有支持這些特性必需的文件。

    在 ASP.NET 4 中動(dòng)態(tài)數(shù)據(jù)的主要目標(biāo)是啟用對(duì)任意 ASP.NET 應(yīng)用程序的動(dòng)態(tài)數(shù)據(jù)新功能。下面的例子展示了在現(xiàn)存頁面中利用動(dòng)態(tài)數(shù)據(jù)功能為控件產(chǎn)生標(biāo)記的功能:

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="True"
    DataKeyNames="ProductID" DataSourceID="LinqDataSource1">
    </asp:GridView>
    <asp:LinqDataSource ID="LinqDataSource1" runat="server"
    ContextTypeName="DataClassesDataContext" EnableDelete="True" EnableInsert="True"
    EnableUpdate="True" TableName="Products">

    </asp:LinqDataSource>

    下面的代碼必須添加到頁面中,才能為這些控件啟用動(dòng)態(tài)數(shù)據(jù)支持:

    GridView1.EnableDynamicData(typeof(Product));

    當(dāng) GridView 控件處于編輯狀態(tài)時(shí),動(dòng)態(tài)數(shù)據(jù)會(huì)自動(dòng)驗(yàn)證輸入的數(shù)據(jù)。如果驗(yàn)證失敗,錯(cuò)誤消息會(huì)顯示出來。

    這個(gè)功能還提供了其他好處,例如能夠指定插入模式的默認(rèn)值。沒有動(dòng)態(tài)數(shù)據(jù),想要為字段實(shí)現(xiàn)默認(rèn)值,必須附加一個(gè)事件,定位控件(使用 FindControl),設(shè)置值。在 ASP.NET 4 中,EnableDynamicData 調(diào)用支持一個(gè)為對(duì)象的任何字段傳遞默認(rèn)值的第二參數(shù)。例如:

    DetailsView1.EnableDynamicData(typeof(Product), new { ProductName = "DefaultName" });

    2) 聲明式 DynamicDataManager 控件語法

    DynamicDataManager 控件已經(jīng)增強(qiáng),所以可以聲明式地配置它,就像 ASP.NET 中的大多數(shù)控件一樣,而不是只能用代碼。例如:

    <asp:DynamicDataManager ID="DynamicDataManager1" runat="server"
    AutoLoadForeignKeys="true">
    <DataControls>
    <asp:DataControlReference ControlID="GridView1" />
    </DataControls>
    </asp:DynamicDataManager>
    <asp:GridView id="GridView1" runat="server">
    </asp:GridView>

    這個(gè)啟用了動(dòng)態(tài)數(shù)據(jù)行為的標(biāo)記在 DynamicDataManager 控件的 DataControls 節(jié)中被引用了。

    3) 實(shí)體模板

    實(shí)體模板提供了不需要?jiǎng)?chuàng)建自定義頁面就能定制數(shù)據(jù)布局的新方法。頁面模板使用 FormView 控件(取代舊版本使用的 DetailsView 控件)和 DynamicEntity 控件來呈現(xiàn)實(shí)體模板。這就能對(duì)動(dòng)態(tài)數(shù)據(jù)呈現(xiàn)的標(biāo)記有更多的控制。

    下面的列表展示了新項(xiàng)目布局模板包含的實(shí)體模板:

    \DynamicData\EntityTemplates
    \DynamicData\EntityTemplates\Default.ascx
    \DynamicData\EntityTemplates\Default_Edit.ascx
    \DynamicData\EntityTemplates\Default_Insert.ascx

    EntityTemplate 目錄包含如何顯示數(shù)據(jù)模型對(duì)象的模板。默認(rèn)地,對(duì)象通過使用 Default.ascx 模板呈現(xiàn)。下面的例子展示了 Default.ascx 控件:

    <asp:EntityTemplate runat="server" ID="TemplateContainer1">
    <ItemTemplate>
    <tr>
    <td>
    <asp:Label ID="Label1" runat="server" OnInit="Label_Init" />
    </td>
    <td>
    <asp:DynamicControl runat="server" OnInit="DynamicControl_Init" />
    </td>
    </tr>
    </ItemTemplate>
    </asp:EntityTemplate>

    默認(rèn)模板可以編輯來改變整個(gè)站點(diǎn)的外觀。這些模板可以進(jìn)行顯示、編輯和插入操作。新模板可以基于數(shù)據(jù)對(duì)象的名稱添加,這樣才能只改變一種類型的對(duì)象的外觀。例如,可以添加下面的模板:

    \DynamicData\EntityTemplates\Products.aspx

    模板可能包含下面的標(biāo)記:

    <tr>
    <td>Name</td>
    <td><asp:DynamicControl runat="server" DataField="ProductName" /></td>
    <td>Category</td>
    <td><asp:DynamicControl runat="server" DataField="Category" /></td>
    </tr>

    新實(shí)體模板通過使用新的 DynamicEntity 顯示在頁面上。在運(yùn)行時(shí),這個(gè)控件使用實(shí)體模板的內(nèi)容代替。下面的標(biāo)記展示了使用實(shí)體模板的 Detail.aspx 頁面模板中的 FormView 控件。注意標(biāo)記中的 DynamicEntity 元素。

    <asp:FormView runat="server" ID="FormView1"
    DataSourceID="DetailsDataSource"
    OnItemDeleted="FormView1_ItemDeleted">
    <ItemTemplate>
    <table class="DDDetailsTable" cellpadding="6">
    <asp:DynamicEntity runat="server" />
    <tr class="td">
    <td colspan="2">
    <asp:DynamicHyperLink ID="EditHyperLink" runat="server"
    Action="Edit" Text="Edit" />
    <asp:LinkButton ID="DeleteLinkButton" runat="server"
    CommandName="Delete"
    CausesValidation="false"
    OnClientClick='return confirm("Are you sure you want to delete this item?");'
    Text="Delete" />
    </td>
    </tr>
    </table>
    </ItemTemplate>
    </asp:FormView>

    4) 為 URL 和 E-mail 地址設(shè)計(jì)的新字段模板

    ASP.NET 4 引入了兩個(gè)新的內(nèi)置字段模板,EmailAddress.ascx 和 Url.ascx。這些模板用于使用 DataType 特性標(biāo)記為 EmailAddress 或 Url 的字段。對(duì)于 EmailAddress 對(duì)象,字段作為超鏈接顯示,并使用 mailto: 協(xié)議創(chuàng)建。當(dāng)用戶點(diǎn)擊鏈接,它打開用戶的 e-mail 客戶端并創(chuàng)建一個(gè)簡略的消息。作為 Url 類型的對(duì)象則以普通超鏈接顯示。

    下面的例子展示了字段如何標(biāo)記。

    [DataType(DataType.EmailAddress)]
    public object HomeEmail { get; set; }

    [DataType(DataType.Url)]
    public object Website { get; set; }

    5) 使用 DynamicHyperLink 控件創(chuàng)建鏈接

    動(dòng)態(tài)數(shù)據(jù)使用新的路由特性(.NET Framework 3.5 SP1 加入)來控制終端用戶訪問網(wǎng)站時(shí)看到的 URL。新的 DynamicHyperLink 控件使構(gòu)造到頁面的鏈接變得容易。下面的例子展示了如何使用 DynamicHyperLink 控件:

    <asp:DynamicHyperLink ID="ListHyperLink" runat="server"
    Action="List" TableName="Products">
    Show all products
    </asp:DynamicHyperLink>

    6) 支持?jǐn)?shù)據(jù)模型中的繼承

    實(shí)體框架和 LINQ to SQL 都支持?jǐn)?shù)據(jù)模型中的繼承。例如數(shù)據(jù)庫中有一個(gè) InsurancePolicy 表,還有兩個(gè)表 CarPolicy 和 HousePolicy,這兩個(gè)表擁有和 InsurancePolicy 相同的字段并添加了更多字段。動(dòng)態(tài)數(shù)據(jù)已經(jīng)修改為能夠理解數(shù)據(jù)模型中繼承的對(duì)象并支持對(duì)繼承數(shù)據(jù)表的 scaffolding(這個(gè)單詞怎么翻譯?)。

    7) 支持多對(duì)多關(guān)系(僅對(duì)實(shí)體框架)

    實(shí)體框架擁有在數(shù)據(jù)表之間進(jìn)行多對(duì)多關(guān)聯(lián)的豐富支持,這是通過在實(shí)體對(duì)象中以集合暴露關(guān)聯(lián)來實(shí)現(xiàn)的。新的 ManyToMany.ascx 和 ManyToMany_Edit.ascx 字段模板已經(jīng)添加了對(duì)有多對(duì)多關(guān)聯(lián)數(shù)據(jù)的顯示和編輯的支持。

    8) 對(duì)控件顯示和支持枚舉的新特性(Attribute)

    DisplayAttribute 添加了字段如何顯示的額外控制。DisplayName 特性(Attribute)在舊版本的動(dòng)態(tài)數(shù)據(jù)中允許更改作為字段標(biāo)題的名稱。新的 DisplayAttribute 類可以指定更多關(guān)于顯示字段的選項(xiàng),例如字段顯示的順序和字段是否用作過濾器。The attribute also provides independent control of the name used for the labels in a GridView control, the name used in a DetailsView control, the help text for the field, and the watermark used for the field (if the field accepts text input).

    EnumDataTypeAttribute 用于把字段映射到枚舉。當(dāng)把這個(gè)特性應(yīng)用到字段時(shí),就指定了枚舉類型。動(dòng)態(tài)數(shù)據(jù)使用新的 Enumeration.ascx 字段模板為顯示和編輯枚舉值創(chuàng)建 UI。模板從數(shù)據(jù)庫把值映射到枚舉中的值。

    9) 對(duì)過濾器的增強(qiáng)支持

    動(dòng)態(tài)數(shù)據(jù) 1.0 內(nèi)置對(duì) Boolean 列和外鍵列的過濾器。過濾器不允許指定它們是否顯示或者以什么順序顯示。新的 DisplayAttribute 同時(shí)解決了這兩個(gè)問題。

    另外一個(gè)增強(qiáng)是過濾器支持已經(jīng)重寫來使用 Web Forms 的新特性。這可以不需要了解過濾器使用的數(shù)據(jù)源控件就能創(chuàng)建過濾器。有了這些擴(kuò)展,過濾器同樣也已經(jīng)變成了模板控件,這樣就允許添加新的。最后,DisplayAttribute 類允許重寫默認(rèn)過濾器,以同樣的方式 UIHint 允許重寫列的默認(rèn)字段模板。

    6. Visual Studio 2010 Web 開發(fā)增強(qiáng)

    更好的 CSS 兼容性,通過 HTML 和 ASP.NET 標(biāo)記片斷提高生產(chǎn)力,以及新的動(dòng)態(tài)的智能感知 JavaScript。

    1) 增強(qiáng)的 CSS 兼容性

    Visual Studio 2010 中的 Visual Web Developer 設(shè)計(jì)器已經(jīng)提高了對(duì) CSS 2.1 標(biāo)準(zhǔn)的遵從。設(shè)計(jì)器更好的保留了 HTML 源集成而且更加健壯。

    2) HTML 和 JavaScript 代碼片斷

    在 HTML 編輯器中,智能感知會(huì)自動(dòng)完成標(biāo)簽名稱。智能感知片斷特性會(huì)自動(dòng)完成整個(gè)標(biāo)簽甚至更多。在 Visual Studio 2010 中,智能感知片斷支持 JavaScript,以及舊版就支持的 C# 和 VB。

    Visual Studio 2010 包含超過200個(gè)片斷,來幫助自動(dòng)完成通用的 ASP.NET 和 HTML 標(biāo)簽,包括必須的屬性(例如 runat="server")和特定標(biāo)簽的通用屬性(例如 ID, DataSourceID, ControlToValidate, Text)。

    可以下載額外的片斷,或編寫自己的片斷,讓自己的團(tuán)隊(duì)用于通用任務(wù)。

    3) JavaScript 智能感知增強(qiáng)

    在 Visual Studio 2010 中,JavaScript 智能感知已經(jīng)重新設(shè)計(jì)來提供更加豐富的編輯體驗(yàn)。智能感知現(xiàn)在可以識(shí)別被方法(例如 registerNamespace 方法)或其他 JavaScript 框架的類似技術(shù)動(dòng)態(tài)生成的對(duì)象。性能也提升了,分析大型腳本庫和顯示智能感知幾乎沒有處理延遲。兼容性也提升了,可以支持幾乎所有第三方庫和支持多種代碼風(fēng)格。Documentation comments are now parsed as you type and are immediately leveraged by IntelliSense.

    7. 使用 Visual Studio 2010 開發(fā) Web 應(yīng)用程序

    當(dāng) ASP.NET 開發(fā)人員部署 Web 應(yīng)用程序時(shí),他們經(jīng)常發(fā)現(xiàn)他們會(huì)遇到下列問題:

    • 部署到共享的宿主站點(diǎn)需要諸如 FTP 的技術(shù),這可能會(huì)比較緩慢。另外,必須手工執(zhí)行諸如運(yùn)行 SQL 腳本的任務(wù)來配置數(shù)據(jù)庫,以及必須更改 IIS 設(shè)置,例如配置一個(gè)虛擬目錄文件夾作為應(yīng)用程序。
    • 在企業(yè)級(jí)環(huán)境中,除了部署 Web 應(yīng)用程序文件,管理員必須經(jīng)常修改 ASP.NET 配置文件和 IIS 設(shè)置。數(shù)據(jù)庫管理員必須運(yùn)行一系列 SQL 腳本來讓應(yīng)用程序的數(shù)據(jù)庫運(yùn)行。這些安裝很費(fèi)人力,經(jīng)常要消耗數(shù)小時(shí)來完成,還要小心記錄。

    Visual Studio 2010 包含了解決這些問題的技術(shù),使得可以無縫地部署 Web 應(yīng)用程序。其中一個(gè)技術(shù)是 IIS Web Deployment Tool(MsDeploy.exe)。

    VS2010 中的 Web 部署特性包含以下主要方面:

    • Web 打包
    • Web.config 轉(zhuǎn)換
    • 數(shù)據(jù)庫部署
    • One-click 發(fā)布 Web 應(yīng)用程序

    下面是有關(guān)這些特性的細(xì)節(jié)。

    1) Web 打包

    VS2010 使用 MSDeploy 工具為應(yīng)用程序創(chuàng)建壓縮文件(.zip),這稱為 Web 包(Web package)。包文件包含關(guān)于應(yīng)用程序的元數(shù)據(jù)以及下面的內(nèi)容:

    • IIS 設(shè)置,包括應(yīng)用程序池設(shè)置,錯(cuò)誤頁面設(shè)置,等等。
    • 實(shí)際的 Web 內(nèi)容,包括 Web 頁面,用戶控件,靜態(tài)內(nèi)容(圖像和 HTML 文件),等等。
    • SQL Server 數(shù)據(jù)庫模式和數(shù)據(jù)。
    • 安全證書,在GAC中安裝的組件,注冊(cè)表設(shè)置,等等。

    Web 包可以拷貝到任何服務(wù)器上,然后使用 IIS 管理器(IIS Manager)手動(dòng)安裝。此外,對(duì)于自動(dòng)部署,包還可以通過命令行命令使用部署 API 來安裝。

    VS2010 提供了內(nèi)置的 MSBuild 任務(wù)和目標(biāo)來創(chuàng)建 Web 包。更多信息,參見 MSDN 網(wǎng)站的 ASP.NET Web Application Project Deployement Overview,和 Vishal Joshi 的博客文章 10+20 reasons why you should create a Web Package。

    2) Web.config 轉(zhuǎn)換

    對(duì)于 Web 應(yīng)用程序部署,VS2010 引入了 XML 文檔轉(zhuǎn)換(XDT),這個(gè)特性用于把 Web.config 文件從開發(fā)設(shè)置轉(zhuǎn)換到生產(chǎn)設(shè)置。轉(zhuǎn)換設(shè)置是在名為 web.debug.config、web.release.config 等文件中指定的。(這些文件的名稱匹配 MSBuild 配置)轉(zhuǎn)換文件只包含需要放到部署的 web.config 文件中的變化。通過使用簡單的語法就可以指定變化。

    下面的例子展示了 web.release.config 文件的一部分,可能為發(fā)布配置(release configuration)部署生產(chǎn)的。Replace 關(guān)鍵字表示在部署過程中 Web.config 文件中的 connectionString 節(jié)點(diǎn)會(huì)使用例子中列出的值代替。

    <connectionStrings xdt:Transform="Replace">
    <add name="BlogDB" connectionString="connection string detail]" />
    </connectionStrings>

    更多信息,參見 MSDN 網(wǎng)站上的 Web.config Transformation Syntax for Web Application Project Deployement 和 Vishal Joshi 的博客文章 Web Deployment: Web.config Transformation。

    3) 數(shù)據(jù)庫部署

    VS2010 部署包可以包含 SQL Server 數(shù)據(jù)庫的依賴。作為包定義的一部分,可以為源數(shù)據(jù)庫提供連接連接字符串。當(dāng)創(chuàng)建 Web 包時(shí),VS2010 會(huì)為數(shù)據(jù)庫模式和數(shù)據(jù)(可選)創(chuàng)建 SQL 腳本,然后把這些腳本添加到包中。也可以提供自定義 SQL 腳本并指定在服務(wù)器中運(yùn)行的順序。在部署期間,可以提供一個(gè)適合目標(biāo)服務(wù)器的連接字符串,部署進(jìn)程隨即會(huì)使用這個(gè)連接字符串運(yùn)行腳本創(chuàng)建數(shù)據(jù)庫模式并添加數(shù)據(jù)。

    另外,通過使用一鍵發(fā)布,當(dāng)應(yīng)用程序發(fā)布到遠(yuǎn)程共享宿主站點(diǎn)時(shí)可以配置部署來直接發(fā)布數(shù)據(jù)庫。更多信息,參見 MSDN 網(wǎng)站上的 How to: Deploy a Database With a Web Application Project 和 Vishal Joshi 的博客文章 Database Deployment with VS 2010。

    4) One-Click 發(fā)布 Web 應(yīng)用程序

    VS2010 還可以使用 IIS 遠(yuǎn)程管理服務(wù)來把 Web 應(yīng)用程序發(fā)布到遠(yuǎn)程服務(wù)器。可以為宿主賬戶或測試服務(wù)器或臨時(shí)服務(wù)器(staging server)創(chuàng)建一個(gè)發(fā)布描述(publish profile)。每個(gè)描述都安全地保存了適當(dāng)?shù)淖C書(credentials)。然后通過使用 Web 一鍵發(fā)布工具欄一鍵就可以部署到任何目標(biāo)服務(wù)器了。使用 VS2010 還可以通過使用 MSBuild 命令行發(fā)布。這要配置團(tuán)隊(duì)生成環(huán)境在持續(xù)集成模型中包含發(fā)布。更多信息,參見 MSDN 網(wǎng)站上的 How to: Deploy a Web Application Project Using One-Click Publish and Web Deploy 和 Vishal Joshi 的博客文章 Web 1-Click Publish with VS 2010。To view video presentations about Web application deployment in Visual Studio 2010, see VS 2010 for Web Developer Previews on Vishal Joshi's blog.

    5) 資源

    下面的網(wǎng)站提供了關(guān)于 ASP.NET 4 和 Visual Studio 2010 的額外信息:

    • ASP.NET 4 — The official documentation for ASP.NET 4 on the MSDN Web site.
    • http://www.asp.net/ — The ASP.NET team’s own Web site.
    • http://www.asp.net/dynamicdata/ and ASP.NET Dynamic Data Content Map — Online resources on the ASP.NET team site and in the official documentation for ASP.NET Dynamic Data.
    • http://www.asp.net/ajax/ — The main Web resource for ASP.NET Ajax development.
    • http://blogs.msdn.com/webdevtools/ — The Visual Web Developer Team blog, which includes information about features in Visual Studio 2010.
    • http://www.codeplex.com/aspnet — The main Web resource for preview releases of ASP.NET.

    轉(zhuǎn)載于:https://www.cnblogs.com/netatomy/articles/ASPNET4-VisualStudio2010-Development-Overview.html

    總結(jié)

    以上是生活随笔為你收集整理的ASP.NET 4 和 Visual Studio 2010 Web 开发概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。