1/1页1 跳转到查看:2199
发新话题 回复该主题

使用Control Adapters优化Asp.net控件

使用Control Adapters优化Asp.net控件

有些时候Asp.net 控件默认状态下生成的html代码,不能满足一些特定的需要。比如

我们想让用户做一些选择,可以很容易的用如下代码实现

<asp:CheckBoxList runat="server">
  <aspistItem Text="One" />
  <aspistItem Text="Two" />
  <aspistItem Text="Three" />
</asp:CheckBoxList>

默认状态下CheckBoxList会将这些选项放在一个table标签里,但是也许有个别情况不适合使用table,而需要一个un-ordered list(ul)。当然我们可以重新写一个继承于CheckBoxList的控件,但是使用Control Adpater会更容易,并且还有一些额外的好处。

首先看一下实现:

1, 写一个继承自WebControlAdapter的类,如下

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.Adapters;
public class RadioButtonListAdapter : WebControlAdapter
{
  protected override void Render(HtmlTextWriter writer)
  {
      ListControl targetControl = this.Control as ListControl;
      // If the control that this adapter is pointing to is not
      // a ListControl (RadioButtonList or CheckBoxList) then
      // we don't want to change the rendering.
      if (targetControl == null || targetControl is IRepeatInfoUser == false)
      {
base.Render(writer);
          return;
      }
      writer.WriteBeginTag("ul");
      if (targetControl.CssClass.Length > 0)
      {
        writer.WriteAttribute("class", targetControl.CssClass);
      }
      writer.Write(">");
      IRepeatInfoUser repeaterInfo = (IRepeatInfoUser)this.Control;
      for (int i = 0; i < targetControl.Items.Count; i++)
      {
          writer.WriteFullBeginTag("li");
          repeaterInfo.RenderItem(ListItemType.Item, i, new RepeatInfo(), writer);
          writer.WriteEndTag("li");
      }
      writer.WriteEndTag("ul");
  }
}

2,新建一个asp.net 文件夹 App_Browsers,在其中添加一个.browser文件,添加如下内容

<browsers>
<browser refID="Default">
      <controlAdapters>
          <adapter controlType="System.Web.UI.WebControls.CheckBoxList"
              adapterType="RadioButtonListAdapter" />
          <adapter controlType="System.Web.UI.WebControls.RadioButtonList"
              adapterType="RadioButtonListAdapter" />
      </controlAdapters>
  </browser>
</browsers>

好了,一切ok。注意到了没有?我们并没有改变先前的asp.net代码.这就是个非常重要的好处啊。
你的选择是做或者不做,但是不做就永远没有机会。

TOP

 
1/1页1 跳转到
发表新主题 回复该主题