[VS2010] ASP.NET 4.0 在 CSS 以及控制項繪製的新功能與增強功能
ASP.NET 自從 2002 年第一個 RTM 版本隨著 .NET Framewok 1.0 發布以來,幾乎可以是席捲了 Web Application Framework 的市場,大量的 Web 開發人員開始由 ASP 轉換到 ASP.NET,順便也吸引了一些 Java Developer 經由 C# 投入 ASP.NET 的懷抱,Visual Studio 以及 ASP.NET 本身將 Web 應用程式開發導向成與開發 Windows 應用程式 (甚至是 VB 應用程式) 的視覺化開發模型的策略奏效,而 Web Forms 也是當時少數可以用事件概念將 HTTP 處理串聯起來並且將常用 HTML 介面包裝成控制項,讓開發人員可以用視覺化的方式來設計 Web 應用程式的 Programming Model,當時的 JSP/PHP 和微軟本身的 ASP 都沒辦法做到這樣的功能。
隨著 ASP.NET 版本升級,它添加了很多新的東西,像是範本化控制項 (template-based control,像是 GridView/ListView/FormView 等),導覽控制項 (Sitemap/Menu/TreeView),AJAX (ASP.NET AJAX 與 Control Toolkit),Data Source Control (SqlDataSource/ObjectDataSource/LinqDataSource) 等功能,使得 Web Form Model 更加成熟,它自動化的 HTML Rendering 能力雖然減輕了很多開發人員的 HTML 繪製負擔,但它卻也在無形中為應用程式加上了一個大包袱:龐大的 Programming Model 以及生硬的 Event Model,使得能夠對 Web Form 控制的範圍其實不大,除非使用 Control Extension 或是 Custom Control,但這個又對開發人員的負擔很重 (User Control 則好一點),ASP.NET MVC 也是因應這個需求所產生,但本文並不談 ASP.NET MVC,而是 ASP.NET 的 Web Form 控制項,控制項的繪製 (rendering) 在 ASP.NET 4.0 做了一些修改,最大的原因是為了符合 CSS 以及讓像 jQuery 這樣高度依賴 CSS 格式的 Scripting Framework 更能夠發揮功能。
1. CSS 繪製相容性 (Rendering Compatibility)。
在 ASP.NET 4.0 中特別有針對 CSS 做了一些強化,而為了要保持和 .NET Framework 3.5 以及更早版本的 ASP.NET 保持行為上的相容,所以特別在 Web.config 中加入了相容性的設定功能:
<system.web>
<pages controlRenderingCompatibilityVersion="3.5|4.0"/>
</system.web>
若設定為 3.5,表示與 3.5 和更早的版本相容。
若設為 4.0,則表示可以啟用 ASP.NET 4.0 才有的部份新功能。
2. 關閉控制項 (Disabling Control) 的修訂 (需要設定 controlRenderingCompatibilityVersion=”4.0”)。
在以往的 Web 控制項中,幾乎都可以使用 Enabled=”false” 來關閉控制項,這個行為在 HTML 4.0 前是正常的,但是到了 HTML 4.01 時,disabled 屬性 (控制 HTML 是否關閉) 卻設定只能在 input 控制項中使用,因此對 ASP.NET 諸多控制項來說,這個行為一定要修改,所以在 ASP.NET 4.0 提供了一個稱為 DisabledCssClass 的屬性,預設值是 aspnetdisabled,表示將這個控制項關閉,但開發人員仍可以自己設計關閉的 CSS,並且使用 DisableCssClass 設定給控制項即可。
3. 將系統設定的隱藏欄位的 DIV 設定一個內建的樣式,以讓 CSS 的 DIV 設定不會影響到該區域 (需要設定 controlRenderingCompatibilityVersion=”4.0”)。
ASP.NET 2.0 開始,系統有將必要的隱藏欄位以 DIV 來包裝,不過它會受到使用者的 CSS 規則所影響,因此 ASP.NET 4.0 修改了這部份的 CSS 設定,加入了一個 aspnetHidden 的 CSS class,以確保這個區域不會受到使用者所定義的 CSS 規則的影響。
4. 部份控制項可以不繪製表格,而以自訂的格式繪製。
在 ASP.NET 4.0 中,有幾個控制項多了一個 RenderOuterTable=”true|false” 的屬性,它可以不讓 Render 繪製出包在外面的表格,而且繪製出指定的 template 內容,這會更讓控制項和 CSS 貼近許多。而這些控制項是:
5. Menu 的繪製強化 (需要設定 controlRenderingCompatibilityVersion=”4.0”)。
在 ASP.NET 4.0 中的 Menu 控制項,將不再以原始的繪製方式,而改以 jQuery 所使用的 <ul> 和 <li> 格式,這對使用 jQuery 的開發人員來說相當的方便,因為他們可以直接套用一些 jQuery 的 plug-in (例如 jdMenu) 來快速的建立 Menu,例如下列的樣板:
<asp:Menu ID="Menu1" runat="server">
<Items>
<asp:MenuItem Text="Home" Value="Home" />
<asp:MenuItem Text="About" Value="About" />
</Items>
</asp:Menu>
會被繪製為:
<div id="Menu1">
<ul>
<li><a href="#" onclick="...">Home</a></li>
<li><a href="#" onclick="...">About</a></li>
</ul>
</div>
<script type="text/javascript">
new Sys.WebForms.Menu('Menu1');
</script>
這個功能被稱為語意化標記 (semantically mark)。而且這個功能也是為了符合 W3C 的 WAI-ARIA 所定義的 Accessibility Guide 中的 Menu 格式 (可參考 http://www.w3.org/TR/wai-aria-practices/#menu)。
參考資料:
ASP.NET 4.0 Enhancement for Data Control:
http://blogs.msdn.com/mikeormond/archive/2009/06/29/asp-net-4-0-enhancements-to-data-controls.aspx
ASP.NET 4.0 Menu and Semantic Markup:
http://blogs.msdn.com/mikeormond/archive/2009/11/13/asp-net-4-0-asp-menu-and-semantic-markup.aspx