若干年前有個需求:客戶可在管理後臺給每一個新聞內容欄目指定新聞的顯示樣式,有的能夠顯示新聞時間,有的則不須要。因而就有了動態模版的應用。記得當時是用 LoadControl 的方式而後 Controls.Add 實現的。最近又遇到了相似的需求,因而想到了能不能在服務端控件綁定前指定Template 便可?通過一番摸索,寫下此文備忘。
通常使用 Template 方式有兩種方式:Page.LoadTemplate 和實現 ITemplate 接口。
方法一:使用 LoadTemplate 的方式很簡單,在調用 DataBind 方法前加載該模板便可,此方法和在頁面上直接設置模版相似(詳見 test0.aspx 示例)。this
protected void Page_Load(object sender, EventArgs e) { DataTable dt = data.DataSource(); rpt_t0.ItemTemplate = this.LoadTemplate("wcTest0.ascx"); rpt_t0.DataSource = dt; rpt_t0.DataBind(); }
方法二:使用 ITemplate 的方式實現: ITemplate.InstantiateIn 只有一個參數 Control,如果給 Repeater 指定模版則此參數是 RepeaterItem 類型等(詳見 test1.aspx 示例);在InstantiateIn裏經過 container.Controls.Add 的方式輸出 Html;orm
public partial class wcTest1 : ITemplate { public DataTable Data { get; set; } public void InstantiateIn(Control container) { var data = container as RepeaterItem; if (null == data) return; int index = data.ItemIndex; var row = Data.Rows[index]; Literal lit = new Literal(); lit.Text = string.Format("<li>test {0},{1}</li>", row[0], row[1]); container.Controls.Add(lit); } }
調用:blog
protected void Page_Load(object sender, EventArgs e) { DataTable dt = data.DataSource(); wcTest1 wt1 = new wcTest1(); wt1.Data = dt; rpt_t1.ItemTemplate = wt1; rpt_t1.DataSource = dt; rpt_t1.DataBind(); }
二者的利弊端比較:
一、使用方法一:可視化程度較好,符合通常使用習慣,修改時不用從新編譯;
二、使用方法二:對於輸出內容邏輯的控制力更強(固然能夠經過定製模版文件的方式變通實現);接口
示例下載get