控件適配器-初步

作者:vkvi 來源:千一網絡(原創) 日期:2007-11-14

在 ASP.NET 中 Label 控件在輸出到客戶端時是一個 span 控件,ListBox 輸出到客戶端時是一個 select 控件,BulletedList 輸出到客戶端時是一個 ul 控件……

也就是說 ASP.NET 的控件和 HTML 控件存在一定的聯系,那么我可不可以更改這種聯系呢?比如我要把 ASP.NET 中的 Label 控件與 HTML 中的 div 控件對應起來,可不可以呢?

可以的,這就是本節要討論的內容,我們以 BulletedList 為例,我們不希望 BulletedList 輸出的是 ul 列表,而是一項一個段落 p 的形式,這里就不要討論輸出 ul 好還是輸出 p 好。

首先

我們要建立一個 class 放在 App_Code 文件夾中,這個類的作用就是重寫 ASP.NET 控件到 HTML 控件的轉換,該類代碼如下:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls.Adapters;
 
 
namespace Cftea
{
    public class BulletedListAdapter : WebControlAdapter
    {
        protected override void RenderBeginTag(HtmlTextWriter writer)
        {
            //base.RenderBeginTag(writer);
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            BulletedList bl = Control as BulletedList;
            if (bl != null)
            {
                int i = 0;
                for (i = 0; i < bl.Items.Count; i++)
                {
                    writer.WriteBeginTag("p");
                    writer.Write(HtmlTextWriter.TagRightChar);
                    writer.Write(bl.Items[i].Text);
                    writer.WriteEndTag("p");
                }
            }
            //base.RenderContents(writer);
        }

        protected override void RenderEndTag(HtmlTextWriter writer)
        {
            //base.RenderEndTag(writer);
        }
    }
}
  • 類名隨便起,但該類要繼承于 WebControlAdapter,WebControlAdapter 的名稱空間是 System.Web.UI.WebControls.Adapters。
  • 重載三個函數:RenderBeginTag,RenderContents,RenderEndTag。
  • 由于我們要全部重寫 BulletedList 的輸出,所以要在這三個函數中去掉對父類的調用,即程序中注釋掉的部分。
  • p 和 ul 不一樣,p 是一個項目一個,而 ul 下一級還需要 li,所以我們只需要在 RenderContents 中增加內容。
  • BulletedList bl = Control as BulletedList; as 用于在兼容的引用類型之間執行轉換,詳情參見 MSDN 的 as(C#),Control 也即要轉換的控件。
  • writer.WriteBeginTag("p"); 寫開始標簽,自動添加“<”。
  • writer.Write(HtmlTextWriter.TagRightChar); 寫“>”,由于 WriteBeginTag 不會自動添加“>”,所以這里要手動寫“>”。
  • writer.Write(bl.Items[i].Text); 寫每一個 item 的文字。
  • writer.WriteEndTag("p"); 寫結束標簽,自動添加“<”和“>”。

然后

重載類已經寫好了,放在 App_Code 目錄下,但還需要進一步設置才有效。

新建一個 App_Browsers 文件夾,再新建一個 browser 文件,同樣文件名并不重要(似乎放在 ASP.NET 文件夾(諸如:App_Browsers、App_Code、App_Themes、bin)下面的文件,其文件名都不重要,重要的是標識、ID、名稱空間,并且 ASP.NET 會自動查找、自動更新,應用起來方便得不得了。)

browser 文件的代碼如下:

<browsers>
    <browser refID="Default">
        <controlAdapters>
            <adapter controlType="System.Web.UI.WebControls.BulletedList"
                     adapterType="Cftea.BulletedListAdapter"></adapter>
        </controlAdapters>
    </browser>
</browsers>
  • <browser refID="Default"> refID="Default" 表示對于所有的瀏覽器都應用其 controlAdapters。
  • adapter 的 controlType 表示要轉換哪一類控件。
  • adapter 的 adapterType 格式為“名稱空間 + 類名”,表示 controlType 交由 adapterType 指示的類處理。

完成

此時我們再在 .aspx 中添加一個 BulletedList,輸出時,就不再是 ul,而是 p 了。

利用適配器,我們可以把 ASP.NET 的控件映射到 HTML 中的某一類控件,也可以映射到一類我們自己設計的“控件”,比如帶選擇框的下拉列表框。

我們還將在后面的連載中具體講解本節步驟的兩點內容,尤其是第二點,可以根據不同的瀏覽器對控件進行不同的轉換。

說明

上面 WriteBeginTag 更好的做法是使用 RenderBeginTag;而 "p" 也使用 HtmlTextWriterTag.P;WriteEndTag("p") 使用 RenderEndTag() 自動匹配。

你前面那位網友看了:Win 7 在哪里安裝 IIS?

▲▲▲嘿,歡迎轉載傳播本站原創文章,盡量保留來源噢。▲▲▲

文章評論
標題:必填
內容:
本站永遠終止與捏造“罪名”不支付廣告費的某度聯盟合作。
vkvi
vkvi

作者簡介: vkvi,致力于 .NET Web 開發、移動開發的技術推廣,在 .NET、SQL Server、Windows Server 等方面有深入研究和豐富經驗,10 年間共計撰寫文章 4000 余篇。 主持金融、國土、農業、電商等多個行業項目執行, 推行“技術提升生產力、人心決定成功率”的管理理論。 聯系他

最新22选5开奖公告