ASP.NET 4.5 與 Visual Studio 2012 的新功能
本文件說明 ASP.NET 4.5 中引進的新增和增強功能。 它也會描述 Visual Studio 2012 中的 Web 開發改進。 本文件最初於 2012 年 2 月 29 日發佈。
ASP.NET Web Forms \(英文\)
-
ASP.NET Core 執行階段和架構
非同步讀取和寫入 HTTP 要求和回應
ASP.NET 4 引進了可使用 HttpRequest.GetBufferlessInputStream 方法讀取 HTTP 要求實體做為串流的能力。 這個方法提供對於要求實體的串流存取。 不過,它會以同步方式執行,而這會在要求的持續時間內繫結執行序。
ASP.NET 4.5 支援在 HTTP 要求實體上以非同步方式讀取串流,以及以非同步方式排清的能力。 ASP.NET 4.5 也可讓您對 HTTP 要求實體進行雙緩衝處理,這可讓您更輕鬆地與下游 HTTP 處理常式整合,例如 .aspx 頁面處理常式和 ASP.NET MVC 控制器。
HttpRequest 處理的改進
ASP.NET 4.5 從 HttpRequest.GetBufferlessInputStream 所傳回的 Stream 參考支援同步和非同步讀取方法。 從 GetBufferlessInputStream 傳回的 Stream 物件現在會同時實作 BeginRead 和 EndRead 方法。 非同步 Stream 方法可讓您在區塊之間以非同步方式讀取要求實體,同時 ASP.NET 會在非同步讀取迴圈的每個反覆項目之間釋放目前的執行序。
ASP.NET 4.5 也新增了以緩衝方式讀取要求實體的配套方法:HttpRequest.GetBufferedInputStream。 新增的這個多載運作類似 GetBufferlessInputStream,同時支援同步和非同步讀取。 不過,在讀取時,GetBufferedInputStream 也會將實體位元組複製到 ASP.NET 內部緩衝區,讓下游模組和處理常式仍然可以存取要求實體。 例如,如果管線中的某些上游程式碼已經使用 GetBufferedInputStream 讀取要求實體,您仍然可以使用 HttpRequest.Form 或 HttpRequest.Files。 這可讓您對要求執行非同步處理 (例如,串流大型檔案並上傳至資料庫),但仍會在這之後執行 .aspx 頁面和 MVC ASP.NET 控制器。
非同步排清回應
當用戶端距離很遠或使用低頻寬連線時,傳送回應給 HTTP 用戶端可能需要相當長的時間。 通常 ASP.NET 應用程式所建立的回應位元節會進行緩衝。 ASP.NET 接著會在要求處理結束時執行累積緩衝區的單一傳送作業。
如果緩衝回應很大 (例如,將大型檔案串流至用戶端),您必須定期呼叫 HttpResponse.Flush,以將緩衝輸出傳送至用戶端,讓記憶體使用量受到控制。 不過,由於 Flush 是同步呼叫,因此反覆呼叫 Flush 仍會在可能長時間執行的要求期間使用執行序。
ASP.NET 4.5 新增支援使用 HttpResponse 類別的 BeginFlush 和 EndFlush 方法,並以非同步方式執行排清。 使用這些方法,您可以建立非同步模組和非同步處理常式,以累加方式將資料傳送至用戶端,而不需要繫結作業系統執行序。 在 BeginFlush 和 EndFlush 呼叫之間,ASP.NET 會釋放目前的執行序。 這可大幅減少支援長時間執行 HTTP 下載所需的使用中執行序總數。
支援以 await 與工作型的非同步模組和處理常式
.NET Framework 4 引進了名為工作的非同步程序設計概念。 工作在 System.Threading.Tasks 命名空間中顯示為 Task 類型與相關類型。 .NET Framework 4.5 會以這個類型為建置基礎,加上編譯器增強功能,讓處理 Task 物件變得簡單。 在 .NET Framework 4.5 中,編譯器支援兩個新的關鍵字:await 和 async。 await 關鍵字是語法簡寫,表示一段程式碼應該以非同步方式等候一些其他程式碼片段。 async 關鍵字則用來標示方法是工作型非同步方法的提示。
await、async 和 Task 物件的組合可讓您更輕鬆地在 .NET 4.5 中撰寫非同步程式碼。 ASP.NET 4.5 支援這些簡化的新增 API,讓您使用新的編譯器增強功能來撰寫非同步 HTTP 模組和非同步 HTTP 處理常式。
非同步 HTTP 模式
假設您想要在傳回 Task 物件的方法內執行非同步工作。 下列程式碼範例會定義非同步方法,以非同步呼叫來下載 Microsoft 首頁。 請注意在方法簽章中使用 async 關鍵字,以及 DownloadStringTaskAsync 呼叫中使用 await。
private async Task
ScrapeHtmlPage(object caller, EventArgs e)
{
WebClient wc = new WebClient();
var result = await wc.DownloadStringTaskAsync("http://www.microsoft.com");
// Do something with the result
}
這就是您必須撰寫的一切 — .NET Framework 會在等候下載完成時自動處理回溯呼叫堆疊,以及在下載完成後自動還原呼叫堆疊。
現在,假設您想要在非同步 ASP.NET HTTP 模組中使用這個非同步方法。 ASP.NET 4.5 包含協助程式方法 (EventHandlerTaskAsyncHelper) 和新的委派類型 (TaskEventHandler),可用來整合工作型非同步方法與 ASP.NET HTTP 管線所公開的舊有非同步程序設計模型。 此範例示範:
public void Init(HttpApplication
context)
{
// Wrap the Task-based method so that it can be used with
// the older async programming model.
EventHandlerTaskAsyncHelper helper =
new EventHandlerTaskAsyncHelper(ScrapeHtmlPage);
// The helper object makes it easy to extract Begin/End methods out of
// a method that returns a Task object. The ASP.NET pipeline calls the
// Begin and End methods to start and complete calls on asynchronous
// HTTP modules.
context.AddOnPostAuthorizeRequestAsync(
helper.BeginEventHandler, helper.EndEventHandler);
}
非同步 HTTP 處理常式
在 ASP.NET 中撰寫非同步處理常式的傳統方法是實作 IHttpAsyncHandler 介面。 ASP.NET 4.5 引進了您可以衍生的 HttpTaskAsyncHandler 非同步基底類型,而讓您更輕鬆地撰寫非同步處理常式。
HttpTaskAsyncHandler 類型是抽象層,因此您必須覆寫 ProcessRequestAsync 方法。 ASP.NET 會從內部整合 ProcessRequestAsync的傳回簽章 (Task 物件) 與 ASP.NET 管線所使用的舊有非同步程序設計模型。
下列範例示範如何在實作非同步 HTTP 處理常式時使用 Task 和 await:
public class MyAsyncHandler : HttpTaskAsyncHandler
{
// ...
// ASP.NET automatically takes care of integrating the Task based override
// with the ASP.NET pipeline.
public override async Task ProcessRequestAsync(HttpContext context)
{
WebClient wc = new WebClient();
var result = await
wc.DownloadStringTaskAsync("http://www.microsoft.com");
// Do something with the result
}
}
新的 ASP.NET 要求驗證功能
根據預設,ASP.NET 執行要求驗證 — 過程中會檢查各種要求,並在欄位、標頭、Cookie 中尋找標記或指令碼。 如果偵測到任何指令碼,ASP.NET 會擲回例外狀況。 這可作為防禦潛在跨網站指令碼攻擊的第一道防線。
ASP.NET 4.5 可讓您輕鬆地選擇性地讀取未經驗證的要求資料。 ASP.NET 4.5 也整合了熱門的 AntiXSS 程式庫,該程式庫先前是外部程式庫。
開發人員經常要求能夠選擇性地關閉其應用程式的要求驗證。 例如,如果您的應用程式是論壇軟體,您可能想要讓使用者能提交 HTML 格式的論壇文章和註解,但仍可確定要求驗證正在檢查其他所有專案。
ASP.NET 4.5 引進兩項功能,讓您能輕鬆使用未經驗證的輸入:延遲 (「lazy」) 要求驗證,以及存取未經驗證的要求資料。
延遲的 (「lazy」) 要求驗證
在 ASP.NET 4.5 中,根據預設,所有要求資料都應受到要求驗證。 不過,您可以將應用程式設定為延遲要求驗證,直到您實際存取要求資料為止。 (這有時稱為延遲要求驗證,根據某些資料案例的延遲載入等條款)。您可以將 httpRUntime 元素中的 requestValidationMode 屬性設定為 4.5,以在 Web.config 檔案中將應用程式設定為使用延遲驗證,如下列範例所示:
<httpRuntime requestValidationMode="4.5" ... />
當要求驗證模式設定為 4.5 之後,只有遇到特定要求值才會觸發要求驗證,而且只有在程式碼存取該值時才會觸發要求驗證。 例如,如果您的程式碼取得 Request.Form[“forum_post”] 的值,則只會針對表單收集中元素叫用要求驗證。 在表單收集中的其他元素則不會進行驗證。 在舊版的 ASP.NET 中,當收集中的任何元素遭到存取時,觸發要求驗證的是整個要求收集。 新的行為可讓不同的應用程式元件更輕鬆地查看不同的要求資料片段,而不需在其他片段上觸發要求驗證。
支援未驗證的要求
單獨延遲要求驗證無法解決選擇性略過要求驗證的問題。 呼叫 Request.Form[“forum_post”] 仍然會觸發該特定要求值的要求驗證。 不過,您可能只是想要存取此欄位而不要觸發驗證,因為您想要允許在該欄位中進行標記。
為了做到這個效果,ASP.NET 4.5 現在支援對要求資料的未驗證存取。 ASP.NET 4.5 包含 HttpRequest 類別中的新增 Unvalidated (未驗證) 集合屬性。 此集合可讓您存取要求資料的所有通用值,例如 Form、QueryString、Cookies 和 Url。
使用論壇範例,為了能夠讀取未經驗證的要求資料,您必須先將應用程式設定為使用新的要求驗證模式:
<httpRuntime requestValidationMode="4.5" ...
/>
接著,您可以使用 HttpRequest.Unvalidated 屬性來讀取未驗證的表單值:
var s = context.Request.Unvalidated.Form["forum_post"];
警告
安全性 - 小心使用未驗證的要求資料! ASP.NET 4.5 新增了未驗證的要求屬性和集合,讓您更容易存取極為特定的未驗證要求資料。 不過,您仍必須對原始要求資料執行自訂驗證,確保這樣做不會將危險的文字呈現公開給使用者。
AntiXSS 程式庫
由於 Microsoft AntiXSS 程式庫越趨熱門,ASP.NET 4.5 現在會納入該程式庫 4.0 版的核心編碼常式。
編碼常式是由新增 System.Web.Security.AntiXss 命名空間中的 AntiXssEncoder 類型進行實作。 您可以呼叫用此類型實作的任何靜態編碼方法,直接使用 AntiXssEncoder 類型。 不過,使用新反 XSS 常式的最簡單方法是將 ASP.NET 應用程式設定為預設使用 AntiXssEncoder 類別。 若要這樣做,請在 Web.config 檔案中新增下列屬性︰
<httpRuntime ...
encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
當 encoderType 屬性設定為使用 AntiXssEncoder 類型時,ASP.NET 中的所有輸出編碼都會自動使用新的編碼常式。
這些是已併入 ASP.NET 4.5 的外部 AntiXSS 程式庫部分:
- HtmlEncode、HtmlFormUrlEncode 和 HtmlAttributeEncode
- XmlAttributeEncode 和 XmlEncode
- UrlEncode 和 UrlPathEncode (新增)
- CssEncode
支援 WebSocket 通訊協定
WebSocket 通訊協定是以標準為基礎的網路通訊協定,定義如何透過 HTTP 建立用戶端與伺服器之間的安全即時雙向通訊。 Microsoft 已與 IETF 和 W3C 標準機構合作,促進定義通訊協定。 任何用戶端都支援 WebSocket 通訊協定 (不只是瀏覽器),Microsoft 在用戶端和行動作業系統上投資支援 WebSocket 通訊協定的大量資源。
WebSocket 通訊協定可讓您更輕鬆地在用戶戶端與伺服器之間建立長時間執行的資料傳輸。 例如,撰寫聊天應用程式會更容易,因為您可以在用戶端與伺服器之間建立真正的長時執行連線。 您不用再採用定期輪詢或 HTTP 長時輪詢,模擬通訊端的行為。
ASP.NET 4.5 和 IIS 8 包含低階 WebSocket 支援,可讓 ASP.NET 開發人員使用 Managed API,以非同步方式讀取和寫入 WebSockets 物件上的字串和二進位資料。 使用 ASP.NET 4.5 時,可以使用全新的 System.Web.WebSockets 命名空間,其中包含使用 WebSocket 通訊協定的類型。
瀏覽器用戶端會透過建立會指向 ASP.NET 應用程式中的 URL DOM WebSocket 物件,建立 WebSockets 連線,如下列範例所示:
socket = new WebSocket("ws://contoso.com/MyWebSocketApplication.ashx");
您可以使用任何類型的模組或處理常式,在 ASP.NET 中建立 WebSockets 端點。 在上述範例使用的是 .ashx 檔案,因為 .ashx 檔案是建立處理常式的快速方式。
根據 WebSockets 通訊協定,ASP.NET 應用程式會藉由指出要求應該從 HTTP GET 要求升級至 WebSockets 要求,以接受用戶端的 WebSockets 要求。 以下是範例:
HttpContext.Current.AcceptWebSocketRequest(// WebSocket delegate goes here)
AcceptWebSocketRequest 方法會接受函式委派,因為 ASP.NET 會回溯目前的 HTTP 要求,並接著將控制權傳輸至函式委派。 從概念角度而言,這種方法類似於使用 System.Threading.Thread 的方式,您可以在其中定義執行背景工作的執行序啟動委派。
ASP.NET 及用戶端成功完成 WebSockets 交握之後,ASP.NET 會呼叫您的委派,WebSockets 應用程式就會開始執行。 下列程式碼範例顯示簡單的回應應用程式,其使用 ASP.NET 中的內建 WebSockets 支援:
public async Task MyWebSocket(AspNetWebSocketContext context)
{
WebSocket socket = context.WebSocket;
while (true)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
// Asynchronously wait for a message to arrive from a client
WebSocketReceiveResult result =
await socket.ReceiveAsync(buffer, CancellationToken.None);
// If the socket is still open, echo the message back to the client
if (socket.State == WebSocketState.Open)
{
string userMessage = Encoding.UTF8.GetString(buffer.Array, 0,
result.Count);
userMessage = "You sent: " + userMessage + " at " +
DateTime.Now.ToLongTimeString();
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMessage));
// Asynchronously send a message to the client
await socket.SendAsync(buffer, WebSocketMessageType.Text,
true, CancellationToken.None);
}
else { break; }
}
}
在 .NET 4.5 中提供 await 關鍵字和非同步工作型操作支援,因此很適合撰寫 WebSocket 應用程式。 程式碼範例顯示 WebSockets 要求會在 ASP.NET 內以完全非同步的方式執行。 應用程式會透過呼叫 await socket.ReceiveAsync,以非同步方式等候訊息從用戶端傳送。 同樣地,您可以呼叫 await socket.SendAsync,將非同步訊息傳送至用戶端。
在瀏覽器中,應用程式會透過 onmessage 函式來接收 WebSockets 訊息。 若要從瀏覽器傳送訊息,您可以呼叫 WebSocket DOM 類型的 send 方法,如下列範例所示:
// Receive a string message from the server.
socket.onmessage = function(msg)
{
document.getElementById("serverData").innerHTML = msg.data;
};
// Send a string message from the browser.
socket.send(document.getElementById("msgText"));
未來,我們可能會發佈此功能的更新,不考慮 WebSockets 應用程式所需的一些低階程式碼。
統合和縮製
統合可讓您將個別的 JavaScript 和 CSS 檔案合併成可視為單一檔案的套件組合。 縮製會藉由移除空白文字和其他不需要的字元,來壓縮 JavaScript 和 CSS 檔案。 這些功能可與 Web Form、ASP.NET MVC 和網頁搭配使用。
套件組合是使用 Bundle 類別或其中一個子類別 (ScriptBundle 和 StyleBundle) 所建立。 設定套件組合的執行個體之後,只要將套件組合新增至全域 BundleCollection 執行個體,即可將套件組合提供給傳入要求。 在預設範本中,套件組合組態會在 BundleConfig 檔案中執行。 此預設組態會為所有範本所使用的核心指令碼和 css 檔案建立套件組合。
套件組合會使用其中一種可能的協助程式方法,從檢視進行參考。 為了在偵錯與發佈模式下支援為套件組合呈現不同的標記,ScriptBundle 和 StyleBundle 類別具有 Helper 方法 Render。 在偵錯模式中,Render 會為套件組合中的每個資源產生標記。 在發佈模式中時,Render 會產生整個套件組合的單一標記元素。 修改 web.config 中編譯元素的偵錯屬性之後,即可在偵錯和發佈模式之間切換,如下所示:
<system.web>
<compilation targetframework="4.5" debug="true" />
...</system.web>
此外,您可以透過 BundleTable.EnableOptimizations 屬性直接設定啟用或停用最佳化。
BundleTable.EnableOptimizations = true;
當檔案進行組合時,一開始先依字母順序排序 (它們在方案總管中的顯示方式)。 接著組織整理,載入已知的程式庫及其自訂擴充模組 (例如 jQuery、MooTools 和 Dojo)。 例如,指令碼資料夾組合的最終順序,如上所示:
- jquery-1.6.2.js
- jquery-ui.js
- jquery.tools.js
- a.js
CSS 檔案也會依字母順序排序,然後重新組織,讓 reset.css 和 normalize.css 位於任何其他檔案之前。 上述 Styles 資料夾組合的最終排序如下:
- reset.css
- content.css
- forms.css
- globals.css
- menu.css
- styles.css
Web 裝載的效能改進
.NET Framework 4.5 和 Windows 8 引進可協助您大幅提升網頁伺服器工作負載效能的功能, 這包括 Web 裝載網站縮短啟動時間和縮減使用 ASP.NET 時的記憶體使用量 (最多 35%)。
關鍵效能因素
在理想情況下,所有網站都應該處於作用中狀態和記憶體中,確保隨時能快速回應下一個要求。 可能影響網站回應性的因素包括如下:
- 應用程式集區回收之後,網站重新啟動所需的時間。 這是當網站組件不再位於記憶體時,啟動網站組件 Web 伺服器作業所花費的時間。 (平台組件仍在記憶體中,因為其他網站會使用這些組件)。這種情況稱為「冷網站、暖架構啟動」或「冷網站啟動」。
- 網站佔用多少記憶體。 這個概念的詞彙定義為「每網站記憶體使用量」或「未共用的工作集」。
新的效能改進著重在這兩個因素。
新效能功能的需求
新功能的需求可細分為下列類別:
- 在 .NET Framework 4 上執行的改進功能。
- 需要 .NET Framework 4.5 但可在任何 Windows 版本上執行的改進功能。
- 僅適用於在 Windows 8 上搭配 .NET Framework 4.5 執行的改進功能。
效能會隨著您能夠啟用的每個改進層級而增加。
某些 .NET Framework 4.5 改進也會發揮適用於其他情境的更廣效能功能。
共用通用組件
需求:.NET Framework 4 和 Visual Studio 11 開發人員預覽版 SDK
伺服器上的不同網站通常會使用相同的協助程式組件 (例如,入門套件或範例應用程式的組件)。 每個網站在其 Bin 目錄中都有自己的這些組件複本。 即使組件的物件程式碼相同,但它們實際上是不同的組件,因此每個組件都必須在冷網站啟動期間個別進行讀取,並分別保留在記憶體中。
新的暫留功能可解決此效率不彰的問題,並降低 RAM 需求和載入時間。 「暫留」可讓 Windows 在檔案系統中保留每個組件的單一複本,並將網站 Bin 資料夾中的個別組件取代為單一複本的符號連結。 如果個別網站需要組件的不同版本,符號連結就以新版本的組件取代,而且只會影響該處的網站。
使用符號連結共用組件時必須用到名為 aspnet_intern.exe 的新增工具,這可讓您建立和管理暫留組件的存放區。 它是隨著 Visual Studio 11 開發人員預覽版 SDK 提供的功能。 不過,它只會在僅安裝 .NET Framework 4 的系統上運作,且假設您已安裝最新的更新。
若要確保所有合格的組件都已暫留,您可以定期執行 aspnet_intern.exe (例如,每週執行一次排定工作)。 常見使用方式如下:
aspnet_intern -mode exec -sourcedir
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files" -interndir C:\ASPNETCommonAssemblies
若要查看所有選項,請執行不含引數的工具。
使用多核心 JIT 編譯加快啟動速度
需求:.NET Framework 4.5
進行冷網站啟動時,不僅必須從磁碟讀取組件,而且網站必須經過 JIT 編譯。 執行複雜網站時,可能會明顯增長延遲。 .NET Framework 4.5 中的新增一般用途技術可藉由將 JIT 編譯分散到可用的處理器核心,並減少這些延遲。 它會使用先前啟動網站期間收集到的資訊,盡量及早執行這項作業。 這是由 System.Runtime.ProfileOptimization.StartProfile 方法實作的功能。
在 ASP.NET 中,預設啟用會使用多核心的 JIT 編譯,因此您不需要執行任何動作,就能利用這項功能。 如果您想要停用此功能,請在 Web.config 檔案中設定下列設定:
<configuration>
<!-- ... -->
<system.web>
<compilation profileGuidedOptimizations="None" />
<!-- ... -->
微調記憶體回收以最佳化記憶體
需求:.NET Framework 4.5
在網站執行之後,其使用記憶體回收行程 (GC) 堆積可能是其記憶體使用量的一個重要因素。 和任何記憶體回收行程一樣,.NET Framework GC 會在 CPU 時間 (集合的頻率和顯著性) 和記憶體使用量之間做出取捨 (用於新增、釋放或可釋放物件的額外空間)。 處理舊版時,我們已提供如何設定 GC 以達到正確平衡的指引 (例如,請參閱 ASP.NET 2.0/3.5 共用主機組態)。
處理 .NET Framework 4.5 時,捨棄多個獨立設定,可以使用工作負載定義的組態設定,讓所有先前建議的 GC 設定以及新微調,能為每個網站工作集提高額外效能。
若要啟用 GC 記憶體微調,請將下列設定新增至 Windows\Microsoft.NET\Framework\v4.0.30319\aspnet.config 檔案:
<configuration>
<!-- ... -->
<runtime>
<performanceScenario value="HighDensityWebHosting" />
<!-- ... -->
(如果您熟悉先前 aspnet.config 變更的指引,請注意,此設定會取代舊的設定,例如,不需要設定 gcServer、gcConcurrent 與其他。您不需要移除舊的設定)。
預先提取 Web 應用程式
需求:在 Windows 8 上執行的 .NET Framework 4.5
在幾個版本中,Windows 包含稱為預先擷取器 (prefetcher) 的技術,可降低應用程式啟動的磁碟讀取成本。 因為冷啟動是用戶端應用程式的常見問題,因此這項技術尚未包含在 Windows Server 中,其中只包含伺服器不可或缺的元件。 預先擷取現在可在最新版的 Windows Server 中取得,可用來最佳化個別網站的啟動過程。
至於 Windows Server,預設不會啟用預先擷取器。 若要啟用並設定高密度 Web 裝載的預先擷取器,請在命令行上執行下列命令集:
sc config sysmain start=auto
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters" /v EnablePrefetcher /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Prefetcher" /v MaxPrefetchFiles /t REG_DWORD /d 8192 /f
net start sysmain
然後,若要整合預先擷取器與 ASP.NET 應用程式,請將下列內容新增至 Web.config 檔案:
<configuration>
<!-- ... -->
<system.web>
<compilation enablePrefetchOptimization="true" />
<!-- ... -->
ASP.NET Web Forms
強型別資料控制項
在 ASP.NET 4.5 中,Web Forms 包含一些處理資料的改進功能。 第一個改進是強型別的資料控制項。 處理舊版 ASP.NET 中的 Web Forms 控制項時,您可以使用 Eval 和資料繫結運算式來顯示資料繫結值:
<ul>
<asp:Repeater runat="server" ID="customers">
<ItemTemplate>
<li>
First Name: <%# Eval("FirstName")%><br />
Last Name: <%# Eval("LastName")%><br />
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
處理雙向資料繫結時,您可以使用 Bind:
<asp:FormView runat="server" ID="editCustomer">
<EditItemTemplate>
<div>
<asp:Label runat="server" AssociatedControlID="firstName">
First Name:</asp:Label>
<asp:TextBox ID="firstName" runat="server"
Text='<%#Bind("FirstName") %>' />
</div>
<div>
<asp:Label runat="server" AssociatedControlID="lastName">
First Name:</asp:Label>
<asp:TextBox ID="lastName" runat="server"
Text='<%#
Bind("LastName") %>' />
</div>
<asp:Button runat="server" CommandName="Update"/>
</EditItemTemplate>
</asp:FormView>
在執行階段,這些呼叫會使用反映來讀取指定成員的值,然後在標記中顯示結果。 這種方法可讓您輕鬆地繫結任意未成形的資料。
不過,這類資料繫結運算式不支援像 IntelliSense 等功能來處理成員名稱、導覽 (例如移至定義),或對這些名稱進行編譯階段檢查。
若要解決此問題,ASP.NET 4.5 新增了宣告控制項所繫結資料的資料類型的能力。 您可以使用新的 ItemType 屬性來執行此動作。 當您設定這個屬性時,資料繫結運算式的範圍中會提供兩個新型別的變數:Item 和 BindItem。 因為變數是強型別,因此您會獲得 Visual Studio 開發體驗的完整優點。
處理雙向資料繫結運算式時,請使用 BindItem 變數:
<asp:FormView runat="server" ID="editCustomer">
<EditItemTemplate>
<div>
<asp:Label runat="server" AssociatedControlID="firstName">
First Name:</asp:Label>
<asp:TextBox ID="firstName" runat="server"
Text='<%#BindItem.FirstName %>' />
</div>
<div>
<asp:Label runat="server" AssociatedControlID="lastName">
First Name:</asp:Label>
<asp:TextBox ID="lastName" runat="server"
Text='<%#BindItem.LastName %>' />
</div>
<asp:Button runat="server" CommandName="Update"/>
</EditItemTemplate>
</asp:FormView>
ASP.NET Web Forms 架構中的大多數控制項支援資料繫結,已更新為支援 ItemType 屬性。
模型繫結
模型繫結會擴充至 ASP.NET Web Forms 控制項中的資料繫結,可處理以程式碼為主的資料存取。 它包含 ObjectDataSource 控制項的概念,以及 MVC ASP.NET 中的模型繫結概念。
選取資料
若要設定資料控制項以使用模型繫結來選取資料,您可以將控制項的 SelectMethod 屬性設定為頁面程式碼中方法的名稱。 資料控制項會在頁面生命週期中的適當時間呼叫方法,並自動繫結傳回的資料。 不需要明確呼叫 DataBind 方法。
在下列範例中,GridView 控制項已設定為使用名為 GetCategories 的方法:
<asp:GridView ID="categoriesGrid"
runat="server"
ItemType="WebApplication1.Model.Category"
SelectMethod="GetCategories" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="CategoryID" HeaderText="ID" />
<asp:BoundField DataField="CategoryName" HeaderText="Name" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="# of Products">
<ItemTemplate><%# Item.Products.Count %></ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
您可以在頁面的程式碼中建立 GetCategories 方法。 處理簡單的選取作業時,方法不需要任何參數,而且應該傳回 IEnumerable 或 IQueryable 物件。 如果已設定新的 ItemType 屬性 (這會啟用強型別資料繫結運算式,如先前的強型別資料控制項所述),則應該傳回這些介面的泛型版本 — IEnumerable<T> 或 IQueryable<T>,其中 T 參數符合 ItemType 屬性的類型 (例如 IQueryable<Category>)。
下列範例顯示 GetCategories 方法的程式碼。 此範例使用 Entity Framework Code First 模型搭配 Northwind 範例資料庫。 程式碼會透過 Include 方法,確保查詢會傳回每個類別之相關產品的詳細資料。 (這可確保標記中的 TemplateField 元素會顯示每個類別中的產品計數,而不需要 n+1 選取。
public IQueryable<Category>
GetCategories()
{
var db = new Northwind();
return db.Categories.Include(c => c.Products);
}
當頁面執行時,GridView 控制項會自動呼叫 GetCategories 方法,並使用已設定的欄位呈現傳回的資料:
因為選擇方法會傳回 IQueryable 物件,所以 GridView 控制項可以在執行查詢之前進一步操作查詢。 例如,GridView 控制項可以在執行之前,將查詢運算式加入排序和分頁至傳回的 IQueryable 物件,讓這些作業由基礎 LINQ 提供者執行。 在此情況下,Entity Framework 可確保這些作業會在資料庫中執行。
下列範例顯示已修改為允許排序和分頁的 GridView 控制項:
<asp:GridView ID="categoriesGrid"
runat="server"
AutoGenerateColumns="false"
AllowSorting="true" AllowPaging="true" PageSize="5"
ItemType="WebApplication1.Model.Category" DataKeyNames="CategoryID"
SelectMethod="GetCategories"
UpdateMethod="UpdateCategory">
<Columns>
<asp:BoundField DataField="CategoryID" HeaderText="ID" SortExpression="CategoryID" />
<asp:BoundField DataField="CategoryName" HeaderText="Name" SortExpression="CategoryName" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="# of Products">
<ItemTemplate><%# Item.Products.Count %></ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>No categories found with a product count of
<%# minProductsCount.SelectedValue %></EmptyDataTemplate>
</asp:GridView>
現在當頁面執行時,控制項可以確保只會顯示目前的資料頁,並且依照選取的資料列排序進行顯示:
若要篩選傳回的資料,參數必須新增至選擇方法。 這些參數會在執行階段由模型繫結填入,而且您可以在傳回資料之前使用這些參數來改變查詢。
例如,當您想要讓使用者在查詢字串中輸入關鍵詞來篩選產品。 您可以將參數新增至此方法,並更新程式碼來使用參數值:
public IQueryable<Product>
GetProducts(string keyword)
{
IQueryable<Product> query = _db.Products;
if (!String.IsNullOrWhiteSpace(keyword))
{
query = query.Where(p => p.ProductName.Contains(keyword));
}
return query;
}
如果提供一個值做為關鍵字,則此程式碼包含 Where,然後傳回查詢結果。
值提供者
先前的範例未特指關鍵字參數的值來自何處。 若要指出這項資訊,您可以使用參數屬性。 在此範例中,您可以使用 System.Web.ModelBinding 命名空間中的 QueryStringAttribute 類別:
public IQueryable<Product>
GetProducts([QueryString]string keyword)
{
IQueryable<Product> query = _db.Products;
if (!String.IsNullOrWhiteSpace(keyword))
{
query = query.Where(p => p.ProductName.Contains(keyword));
}
return query;
}
這會指示模型繫結,嘗試在執行階段將查詢字串中的值繫結至關鍵字參數。 (這可能涉及執行類型轉換,但在此案例中不會)。如果無法提供值,而且類型不可為 Null,則會擲回例外狀況。
這些方法值的來源稱為值提供者,而指出要使用哪些值提供者的參數屬性稱為值提供者屬性。 Web Forms 會包含 Web Forms 應用程式中所有一般使用者輸入來源的值提供者和對應的屬性,例如查詢字串、Cookie、表單值、控制項、檢視狀態、工作階段狀態和設定檔屬性。 您也可以撰寫自訂值提供者。
根據預設,參數名稱會做為索引鍵,可用來尋找值提供者集合中的值。 在此範例中,程式碼會尋找名為 keyword 的查詢字串值 (例如 ~/default.aspx?keyword=chef)。 您可以將自訂索引鍵當做引數傳遞至參數屬性,指定自訂索引鍵。 例如,若要使用名為 q 的查詢字串變數值,您可以執行此動作:
public IQueryable<Product>
GetProducts([QueryString("q")]string keyword)
{
IQueryable<Product> query = _db.Products;
if (!String.IsNullOrWhiteSpace(keyword))
{
query = query.Where(p => p.ProductName.Contains(keyword));
}
return query;
}
如果此方法位於頁面的程式碼中,使用者可以使用查詢字串,傳遞關鍵字來篩選結果:
模型繫結會完成許多原本要手動撰寫程式碼的工作:讀取值、檢查 Null 值、嘗試將它轉換成適當的類型、檢查轉換是否成功,最後使用查詢中的值。 模型繫結會減少程式碼數量,而且能夠在整個應用程式中重複使用。
依控制項值進行篩選
假設您想要擴充範例,讓使用者從下拉式清單中選擇篩選值。 將下列下拉式清單新增至標記,並將其設定為使用 SelectMethod 屬性,從其他方法取得其資料:
<asp:Label runat="server" AssociatedControlID="categories"
Text="Select a category to show products for: " />
<asp:DropDownList runat="server" ID="categories"
SelectMethod="GetCategories" AppendDataBoundItems="true"
DataTextField="CategoryName" DataValueField="CategoryID"
AutoPostBack="true">
<asp:ListItem Value="" Text="- all -" />
</asp:DropDownList>
一般而言,您也會將 EmptyDataTemplate 元素新增至 GridView 控制項,如此一來,如果找不到相符的產品,控制項就會顯示訊息:
<asp:GridView ID="productsGrid"
runat="server" DataKeyNames="ProductID"
AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false"
SelectMethod="GetProducts" >
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ID" />
<asp:BoundField DataField="ProductName" HeaderText="Name"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Unit Price"
SortExpression="UnitPrice" />
<asp:BoundField DataField="UnitsInStock" HeaderText="# in Stock"
SortExpression="UnitsInStock" />
</Columns>
<EmptyDataTemplate>
No products matching the filter criteria were found</EmptyDataTemplate>
</asp:GridView>
在此頁程式碼中,為下拉式清單新增選擇方法:
public IQueryable<Category>
GetCategories()
{
return _db.Categories;
}
最後,更新 GetProducts 選擇方法,以從下拉式清單中取得包含所選類別識別碼的新參數:
public IQueryable<Product>
GetProducts(
[QueryString("q")] string keyword,
[Control("categories")] int? categoryId)
{
IQueryable<Product> query = _db.Products;
if (!String.IsNullOrWhiteSpace(keyword))
{
query = query.Where(p => p.ProductName.Contains(keyword));
}
if (categoryId.HasValue && categoryId > 0)
{
query = query.Where(p => p.CategoryID == categoryId);
}
return query;
}
現在當此頁面執行時,使用者可以從下拉式清單中選取類別,而且 GridView 控制項會自動重新繫結,並顯示篩選的資料。 這個情況可能發生,因為模型繫結會追蹤選擇方法的參數值,並偵測回傳之後是否有任何參數值變更。 如果發生這種情況,模型繫結會強制相關聯的資料控制項重新繫結至資料。
HTML 編碼的資料繫結運算式
您現在可以對資料繫結運算式的結果進行 HTML 編碼。 將冒號 (:) 新增至 <%# 前置詞結尾,標記資料繫結運算式:
<asp:TemplateField HeaderText="Name">
<ItemTemplate><%#: Item.Products.Name %></ItemTemplate>
</asp:TemplateField>
低調驗證
您現在可以設定內建驗證程式控制項,並針對用戶端驗證邏輯使用低調的 JavaScript。 這可大幅減少在頁面標記中內嵌呈現的 JavaScript 數量,並減少整體頁面大小。 您可以透過下列任何方式,為驗證程式控制項設定低調的 JavaScript:
以全域方式,將下列設定新增至 Web.config 檔案中的 <appSettings> 元素:
<add name="ValidationSettings:UnobtrusiveValidationMode" value="WebForms" />
以全域方式,將靜態 System.Web.UI.ValidationSettings.UnobtrusiveValidationMode 屬性設定為 UnobtrusiveValidationMode.WebForms (通常是在 Global.asax 檔案的 Application_Start 方法)。
將 Page 類別的新 UnobtrusiveValidationMode 屬性設定為 UnobtrusiveValidationMode.WebForms,個別顯示頁面。
HTML5 更新
有些 Web Forms 伺服器控制項的改進功能可發揮 HTML5 的新功能:
- TextBox 控制項的 TextMode 屬性已更新,並支援新的 HTML5 輸入類型,例如 email、datetime 與其他。
- FileUpload 控制項現在支援從支援此 HTML5 功能的瀏覽器上傳多個檔案。
- 驗證程式控制項現在支援驗證 HTML5 輸入元素。
- 新的 HTML5 元素,其屬性代表 URL 現在支援 runat=“server”。 因此,您可以在 URL 路徑中使用 ASP.NET 慣例,例如 ~ 運算子來代表應用程式根目錄 (例如 <video runat="server" src="~/myVideo.wmv" />)。
- UpdatePanel 控制項已修正,可支援張貼 HTML5 輸入欄位。
ASP.NET MVC 4
ASP.NET MVC 4 Beta 現在隨附於 Visual Studio 11 Beta。 ASP.NET MVC 是一種架構,可透過 Model-View-Controller (MVC) 模式開發高度可測試且可維護的 Web 應用程式。 ASP.NET MVC 4 可讓您輕鬆地建置行動 Web 的應用程式,並包含 ASP.NET Web API,可協助您建置可觸及任何裝置的 HTTP 服務。 如需詳細資訊,請參閱 ASP.NET MVC 4 版本資訊。
ASP.NET Web Pages 2
新增功能包括如下:
- 新增與更新的網站範本。
- 新增使用驗證協助程式的伺服器端和用戶端驗證。
- 使用資產管理員登錄指令碼的能力。
- 啟用使用 OAuth 和 OpenID 從 Facebook 和其他網站登入。
- 使用地圖服務協助程式新增地圖。
- 並排執行網頁應用程式。
- 呈現行動裝置的頁面。
如需這些功能和完整頁面程式碼範例的詳細資訊,請參閱 Web Pages 2 Beta 最受歡迎的功能。
Visual Web Developer 11 Beta
本節提供 Visual Web Developer 11 Beta 和 Visual Studio 2012 候選版中 Web 開發改進功能的相關資訊。
Visual Studio 2010 與 Visual Studio 2012 候選版之間的專案共用 (專案相容性)
直到 Visual Studio 2012 候選版發行之前,在較新版本的 Visual Studio 中開啟現有的專案會啟動轉換精靈。 這會強制專案的內容 (資產) 升級,並將解決方案升級為與回溯相容的新格式。 因此,在轉換之後,您無法在舊版 Visual Studio 中開啟專案。
許多客戶告訴我們,這不是正確的方法。 在 Visual Studio 11 Beta 中,我們現在支援使用 Visual Studio 2010 SP1 共用專案和解決方案。 這表示如果您在 Visual Studio 2012 候選版中開啟 2010 專案,您仍然可以在 Visual Studio 2010 SP1 中開啟專案。
注意
Visual Studio 2010 SP1 與 Visual Studio 2012 候選版之間無法共用幾個類型的專案。 其中包括一些較舊的專案 (例如 ASP.NET MVC 2 專案) 或特殊用途的專案 (例如安裝專案)。
當您第一次在 Visual Studio 11 Beta 中開啟 Visual Studio 2010 SP1 Web 專案時,下列屬性會新增至專案檔:
- FileUpgradeFlags
- UpgradeBackupLocation
- OldToolsVersion
- VisualStudioVersion
- VSToolsPath
升級專案檔的程式會使用 FileUpgradeFlags、UpgradeBackupLocation 和 OldToolsVersion。 它們不會影響在 Visual Studio 2010 中使用專案。
VisualStudioVersion 是 MSBuild 4.5 中使用的新屬性,表示目前專案的 Visual Studio 版本。 由於 MSBuild 4.0 中不存在此屬性 (Visual Studio 2010 SP1 所使用的 MSBuild 版本),因此我們會專案檔中插入預設值。
VSToolsPath 屬性可用來判斷要從 MSBuildExtensionsPath32 設定所代表的路徑匯入的正確 .targets 檔案。
另外還有一些與 Import 元素相關的變更。 這些都是支援 Visual Studio 這兩個版本相容性的必要變更。
注意
如果在兩部不同電腦的 Visual Studio 2010 SP1 與 Visual Studio 11 Beta 之間共用專案,而且如果專案在 App_Data 資料夾中包含本機資料庫,則您必須確定資料庫所使用的 SQL Server 版本已安裝在這兩部電腦上。
ASP.NET 4.5 網站範本中的組態變更
下列是已在 Visual Studio 2012 候選版中使用網站範本建立的網站中的預設 Web.config 檔案所做的變更:
- 在
<httpRuntime>
元素中,encoderType
屬性現在預設會設定為使用已新增至 ASP.NET 的 AntiXSS 類型。 如需詳細資訊,請參閱 AntiXSS 程式庫。 - 此外,在
<httpRuntime>
元素中,requestValidationMode
屬性也會設定為 「4.5」。 這表示根據預設,要求驗證會設定為使用延遲的 (「lazy」) 要求驗證。 如需詳細資訊,請參閱新的 ASP.NET 要求驗證功能。 <system.webServer>
區段的<modules>
元素不包含runAllManagedModulesForAllRequests
屬性。 (其預設值為 false)。這表示如果您使用尚未更新為 SP1 的 IIS 7 版本,所以您在使用新站台時可能會發生路由問題。 如需詳細資訊,請參閱 IIS 7 中 ASP.NET 路由的原生支援。
這些變更不會影響現有的應用程式。 不過,它們可能代表現有網站與使用新範本為 ASP.NET 4.5 建立的新網站之間的行為差異。
IIS 7 中 ASP.NET 路由的原生支援
這不是 ASP.NET 的變更,而是新網站專案的範本變更,如果您使用的是未套用 SP1 更新的 IIS 7 版本,您的範本可能會受到影響。
在 ASP.NET 中,您可以將下列組態設定新增至應用程式來支援路由:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<!-- more -->
</modules>
</system.webServer>
</configuration>
當 runAllManagedModulesForAllRequests 為 true 時,即使 URL 上沒有 .aspx、.mvc 或類似的擴充功能,則類似 http://mysite/myapp/home
的 URL 會移至 ASP.NET。
對於 IIS 7 所做的更新會讓 runAllManagedModulesForAllRequests 設定變成非必要,並可支援原生 ASP.NET 路由。 (如需更新的相關資訊,請參閱 Microsoft 支援服務文章:更新可供特定 IIS 7.0 或 IIS 7.5 處理常式處理 URL 未以句點結束的要求。)
如果您的網站在 IIS 7 上執行,且 IIS 已更新,則不需要將 runAllManagedModulesForAllRequests 設定為 true。 事實上,我們不建議將它設定為 true,因為這樣會增加要求不必要的處理額外負荷。 當此設定為 true 時,所有要求,包括 .htm、.jpg 和其他靜態檔案的要求,也會經過 ASP.NET 要求管線。
如果您使用 Visual Studio 2012 RC 中提供的範本建立新的 ASP.NET 4.5 網站,則網站的設定不包含 runAllManagedModulesForAllRequests 設定。 這表示設定預設為 false。
如果您接著在未安裝 SP1 的 Windows 7 上執行網站,IIS 7 將不會包含必要的更新。 因此,路由將無法運作,而且您會看到錯誤。 如果您遇到路由無法運作的問題,您可以執行下列其中一個步驟:
- 將 Windows 7 更新為 SP1,這樣會將更新加入至 IIS 7。
- 安裝先前所列 Microsoft 支援服務文章所介紹的更新。
- 在該網站的 Web.config 檔案中,將 runAllManagedModulesForAllRequests 設定為 true。 請注意,這會為要求增加一些額外負荷。
HTML 編輯器
智慧任務
在 [設計檢視] 中,伺服器控制項的複雜屬性通常會有相關聯的對話方塊和精靈,讓您能輕鬆設定。 例如,您可以使用特殊對話方塊,將資料來源新增至 Repeater 控制項,或將資料行加入 GridView 控制項。
不過,資料來源檢視中尚未提供複雜屬性的這類 UI 說明。 因此,Visual Studio 11 引進了適用於資料來源檢視的智慧工作。 智慧工作 (Smart Tasks) 是 C# 和 Visual Basic 編輯器中常用功能的內容感知捷徑。
處理 ASP.NET Web Forms 控制項時,當插入點是在元素內部時,智慧工作會顯示為伺服器標籤上的小字符:
智慧工作的展開方法是按下該字符,或按 CTRL+. (點),方法就像使用程式碼編輯器。 然後,它會顯示類似 [設計] 檢視中 [智慧工作] 的捷徑。
例如,上圖中的智慧工作會顯示 GridView 工作選項。 如果您選擇 [編輯資料列],則會顯示下列對話方塊:
填入對話方塊會設定您可以在 [設計] 檢視中設定的相同屬性。 當您按一下 [確定] 時,控制項的標記會更新為新的設定:
WAI-ARIA 支援
撰寫無障礙網站變得越來越重要。 WAI-ARIA 協助工具標準定義了開發人員應如何撰寫無障礙網站。 Visual Studio 現在完全支援此標準。
例如,角色屬性現在具有完整的 IntelliSense:
WAI-ARIA 標準也引進前置詞 aria- 的屬性,讓您在 HTML5 檔案中新增語意。 Visual Studio 也完全支援這些 aria- 屬性:
新增 HTML 程式碼片段
為了更快速且更容易撰寫常用的 HTML5 標記,Visual Studio 包含一些程式碼片段。 範例是影片程式碼片段:
若要叫用此程式碼片段,請在 IntelliSense 中選取元素時連按 Tab 兩下:
這會產生您可以自訂的程式碼片段。
擷取至使用者控制項
在大型網頁中,將個別片段移至使用者控制項是不錯的主意。 這種重構形式有助於提高頁面可讀性,並可簡化頁面結構。
若要簡化此作業,當您在 [資料來源] 檢視中編輯 Web Forms 頁面時,您現在可以選取頁面中的文字,以滑鼠右鍵按一下,然後選擇 [擷取至使用者控制項]:
屬性中程式碼 Nuggets 的 IntelliSense
Visual Studio 一直是以任何頁面或控制項為伺服器端程式碼 Nuggets 提供 IntelliSense。 現在 Visual Studio 也包括適用於 HTML 屬性中程式碼 Nuggets 的 IntelliSense。
這可讓您更輕鬆地建立資料繫結運算式:
當您重新命名開頭或結尾標記時,自動重新命名相符的標記
如果您重新命名 HTML 元素 (例如,將 div 標記變更為 header 標記),對應的開頭或結尾標籤也會即時變更。
這有助於避免您忘記變更結尾標記或變更錯誤的錯誤。
事件處理常式產生
Visual Studio 現在包含資料來源檢視中的功能,可協助您撰寫事件處理常式,並手動繫結它們。 如果您要在 [資料來源] 檢視中編輯事件名稱,IntelliSense 會顯示<建立新事件>,這會在具有正確簽章的頁面程式碼中建立事件處理常式:
根據預設,事件處理常式會針對事件處理方法的名稱使用控制項的識別碼:
產生的事件處理常式看起來會像這樣 (在此案例中使用的是 C#):
智慧縮排
當您在空白 HTML 元素內按下 Enter 時,編輯器會將插入點放在正確的位置:
如果您在此位置按下 Enter 鍵,則會向下移動結尾標記,並進行縮排,以符合開頭標記。 插入點也會縮排:
自動縮減陳述式完成
Visual Studio 中的 IntelliSense 清單現在會根據您輸入的內容進行篩選,並只顯示相關的選項:
IntelliSense 也會根據 IntelliSense 清單中個別單字的標題大小寫進行篩選。 例如,如果您輸入「dl」,則會顯示 dl 和 asp:DataList:
這項功能可讓您更快速地完成已知元素的陳述式。
JavaScript 編輯器
Visual Studio 2012 候選版中的 JavaScript 編輯器是全新工具,可大幅改善在 Visual Studio 中使用 JavaScript 的體驗。
程式碼大綱
現在會自動為所有函式建立大綱區域,讓您摺疊與目前焦點無關的檔案組件。
括號對稱
當您將插入點放在左大括弧或右大括弧時,編輯器會反白顯示相符的括號。
移至定義
[移至定義] 命令可讓您跳至函式或變數的來源。
ECMAScript5 支援
編輯器支援 ECMAScript5 中的新語法和 API,這是描述 JavaScript 語言的最新版本標準。
DOM IntelliSense
已改進 DOM API 的 IntelliSense,支援許多新的 HTML5 API,包括 querySelector、DOM 記憶體、跨文件傳訊和畫布。 DOM IntelliSense 現在是由單一簡單的 JavaScript 檔案所推動,而不是由原生類型程式庫定義所推動。 這可讓您輕鬆地擴充或取代。
VSDOC 簽章多載
您可以現在使用新的 <signature> 元素,針對 JavaScript 函式的個別多載宣告詳細的 IntelliSense 註解,如下列範例所示:
function GetOrSet(key, value) {
/// <signature>
/// <summary>Gets the value</summary>
/// <param name="key" type="String">The key to get the value for</param>
/// <returns type="String" />
/// </signature>
/// <signature>
/// <summary>Sets the value</summary>
/// <param name="key" type="String">The key to set the value for</param>
/// <param name="value" type="String">The value to set</param>
/// <returns type="MyLib" />
/// </signature>
if (value) {
values[key] = value;
return this;
} else {
return values[key];
}
}
隱含參考
您現在可以將 JavaScript 檔案新增至中央清單,此清單會隱含地包含在任何指定 JavaScript 檔案或區塊參考的檔案清單中,這表示您將取得其內容的 IntelliSense。 例如,您可以將 jQuery 檔案新增至檔案的中央清單,這樣一來,無論您是否明確參考 (使用 /// <reference />),任何 JavaScript 區塊中都能取得 jQuery 函式的 IntelliSense。
CSS 編輯器
自動縮減陳述式完成
CSS 的 IntelliSense 清單現在會根據所選架構支援的 CSS 屬性和值進行篩選。
IntelliSense 也支援標題案例搜尋:
階層式縮排
CSS 編輯器會使用縮排來顯示階層式規則,讓您概觀串聯規則的邏輯組織方式。 在下列範例中,選取器 #list 是清單的串聯子系,因此縮排。
下列範例顯示了更複雜的繼承關係:
規則的縮排是由其父規則所決定。 預設會啟用階層式縮排,但您可以停用 [選項] 對話方塊進行停用 (功能表列中的 [工具]、[選項]):
CSS 駭客支援
分析數百個真實世界的 CSS 檔案顯示 CSS 駭客是極常見的工作,現在 Visual Studio 支援最常使用的 CSS 檔案。 此支援包括 IntelliSense 和星號的驗證、底線 (_) 屬性駭客:
一般選擇器駭客攻擊也會支援,因此即使套用階層縮排,它們仍持續受到維護。 用來以 Internet Explorer 7 為目標的典型選取器駭客是使用 *:first-child + html 加上選擇器。 使用該規則會維護階層式縮排:
廠商特定架構 (-moz-、-webkit)
CSS3 引進許多在不同時間由不同瀏覽器實作的屬性。 這先前會強制開發人員使用廠商特定的語法來撰寫特定瀏覽器的程式碼。 這些瀏覽器特定屬性現在包含在 IntelliSense 中。
註解和取消註解支援
您現在可以使用您在程式碼編輯器中使用的相同快捷方式,進行註解和取消註解 CSS 規則 (Ctrl+K、C 可進行註解,Ctrl+K 可取消註解)。
顏色選擇器
在舊版 Visual Studio 中,適用於色彩相關屬性的 IntelliSense 是由具名色彩值的下拉式清單所組成。 該清單已由全功能色彩選擇器取代。
當您輸入色彩值時,色彩選擇器會自動顯示,並顯示先前使用的色彩清單,後面跟著預設調色盤。 您可以使用滑鼠或鍵盤來選取色彩。
清單可以展開至完整的色彩選擇器。 選擇器可讓您在移動透明度滑桿時,自動將任何色彩轉換成 RGBA 來控制 Alpha 色板:
程式碼片段
CSS 編輯器中的程式碼片段可讓您更輕鬆地且更快速地建立跨瀏覽器樣式。 許多需要瀏覽器特定設定的 CSS3 屬性現在已匯入程式碼片段。
CSS 程式碼片段支援進階案例 (例如 CSS3 媒體查詢),方法是輸入 at-symbol (@),接著會顯示 IntelliSense 清單。
當您選取 @media 值並按下 Tab 鍵時,CSS 編輯器會插入下列程式碼片段:
在搭配程式碼片段進行編碼設計時,您可以建立自己的 CSS 程式碼片段。
自訂區域
程式碼編輯器中已有的具名程式碼區域現在可供 CSS 編輯器使用。 這可讓您輕鬆地將相關的樣式區塊進行分組。
當區域摺疊時,它會顯示區域的名稱:
Page Inspector
頁面偵測器是一種工具,可在 Visual Studio IDE 中呈現網頁 (HTML、Web Forms、ASP.NET MVC或網頁),並可讓您檢查原始程式碼和產生的輸出。 處理 ASP.NET 頁面時,Page Inspector 可讓您判斷哪一個伺服器端程式碼已產生呈現至瀏覽器的 HTML 標記。
如需 Page Inspector 的詳細資訊,請參閱下列教學課程:
- 在 ASP.NET MVC 中使用 Page Inspector
- 在 ASP.NET Web Forms 中使用 Page Inspector
發佈
發佈設定檔
在 Visual Studio 2010 中,Web 應用程式專案的發佈資訊不會儲存在版本控制中,而且其設計是不與他人共用。 在 Visual Studio 2012 候選版中,發佈設定檔的格式已變更。 它已製作成小組成品,現在可以輕鬆地從 MSBuild 型組建進行運用。 組建組態資訊位於 [發佈] 對話方塊中,方便您輕鬆地在發佈之前切換組建組態。
發佈設定檔會儲存在 PublishProfiles 資料夾中。 資料夾的位置取決於您所使用的程式設計語言而異:
- C#: Properties\PublishProfiles
- Visual Basic: My Project\PublishProfiles
每個設定檔都是 MSBuild 檔案。 在發佈期間,此檔案會匯入專案的 MSBuild 檔案。 在 Visual Studio 2010 中,如果您想要變更發佈或封裝程式,您必須將自訂專案放在名為 ProjectName.wpp.targets 的檔案中。 這點仍受支援,但您現在可以將自訂專案放在發佈設定檔本身。 如此一來,自訂專案只會用於該設定檔。
您現在也可以利用 MSBuild 的發佈設定檔。 若要這樣做,請在建構專案時使用以下命令:
msbuild.exe project.csproj /t:WebPublish /p:PublishProfile=ProfileName
project.csproj 值是專案的路徑,而 ProfileName 是要發佈的設定檔名稱。 或者,您可以傳入設定檔的完整路徑,而不是傳遞 PublishProfile 屬性的設定檔名稱。
ASP.NET 先行編譯和合併
處理 Web 應用程式專案時,Visual Studio 2012 候選版會在 [套件/發佈 Web 屬性] 頁面上新增一個選項,讓您在發佈或封裝專案時預先編譯及合併網站的內容。 若要查看這些選項,請以滑鼠右鍵按一下 [方案總管] 中的專案,選擇 [屬性],然後選擇 [封裝/發佈 Web] 屬性頁。 下圖顯示發佈前先行編譯此應用程式的選項。
選取此選項時,每當您發佈或封裝 Web 應用程式時,Visual Studio 就會預先編譯應用程式。 如果您想要控制網站的先行編譯方式或組建合併方式,請按一下 [進階] 按鈕來設定這些選項。
IIS Express
在 Visual Studio 中測試 Web 專案的預設網頁伺服器現在是 IIS Express。 Visual Studio 開發伺服器仍然是開發期間用於本機網頁伺服器的選項,但 IIS Express 現在是建議的伺服器。 在 Visual Studio 11 Beta 中使用 IIS Express 的體驗十分類似在 Visual Studio 2010 SP1 中的使用體驗。
免責聲明
這是一份初稿,內容在本文所述的軟體於正式商業發行前都可能有所更動。
本文件包含的資訊代表 Microsoft Corporation 對於截至文件發行當日為止探討之問題的最新觀點。 由於 Microsoft 必須回應不斷變動的市場狀況,因此您不應該將這些觀點解讀成 Microsoft 所做的承諾,而且 Microsoft 也無法保證發行日期後提出之任何資訊的正確性。
本技術白皮書僅供參考。 MICROSOFT 對本文件中的資訊不提供任何明示、暗示或法定擔保。
遵守所有適用之著作權法係使用者的責任。 在不影響著作權法律所賦予權利之情況下,未經 Microsoft Corporation 明示書面許可,不得將本文件任何部分重製、儲存或引進檢索系統,或以任何形式、任何方式 (電子、機械、影印、錄音或其他方式) 或因任何目的進行傳輸。
Microsoft 對本文件所述及之主題可能擁有專利權、申請中專利權、商標權、著作權或其他智慧財產權。 除非 Microsoft 書面授權合約中所明示規定者外,提供本文件並不授予 貴用戶上述專利權、商標、著作權或其他智慧財產權。
除非另有特別聲明,否則本文件範例所舉之公司、組織、產品、網域名稱、電子郵件地址、標誌、人名、地名和事件均屬虛構,並非特定意指任何真實的公司、組織、產品、網域名稱、電子郵件地址、標誌、人名、地名和事件。
(C) 2012 Microsoft Corporation. 著作權所有,並保留一切權利。
Microsoft 和 Windows 是 Microsoft Corporation 在美國及/或其他國家/地區的註冊商標或商標。
本文件中所提實際公司和產品名稱,可能為各所有人所有之商標。