在ControlAdapter中渲染控件

时间:2015-11-05 23:25:45

标签: c# asp.net webforms

这是与我发布的earlier question相关的一些内容,但不完全相同。我终于能够启动我的控制适配器了,但是我不能按照我的预期让它工作。

我想使用控件适配器的全部原因是为系统控件添加额外的标记,例如RadioButton。我正在使用另一个期望这个的框架。

如果我们假设没有任何更改的RadioButton会呈现像

<input id="MainContent_RadioButton1" type="radio" name="ctl00$MainContent$RadioButton1" value="RadioButton1" /><label for="MainContent_RadioButton1">My Radio Button</label>

我想将标记更改为

<div class="wrapper">
<input id="MainContent_RadioButton1" type="radio" name="ctl00$MainContent$RadioButton1" value="RadioButton1" /><label for="MainContent_RadioButton1">My Radio Button</label>
</div>

这是一个非常简化的示例,所以我不是在寻找对我的控件进行子类化的建议,或者在我的页面中使用类添加面板。

在我的Page-Init中我有

protected void Page_Init(object sender, EventArgs e)
{
  HttpContext.Current.Request.Browser.Adapters["System.Web.UI.WebControls.RadioButton"] =
    "ControlAdapterTest.Controls.ControlAdaptors.RadioButtonAdapter";
}

我的控制适配器看起来像

public class RadioButtonAdapter : WebControlAdapter {

    public new RadioButton Control => (RadioButton) base.Control;

    #region Overrides of WebControlAdapter

    protected override void Render(HtmlTextWriter writer)
    {
      base.Render(writer);
    }

    #endregion
  }
}

没有适配器

如果不使用控制适配器,我的单选按钮显然可以正常显示。

enter image description here

适配器

添加我的控制适配器并更改其他内容,我得到了意外的行为:

enter image description here

我尝试添加调用以进行基本控件渲染,例如

  RenderChildren(writer);
  RenderContents(writer);

但我似乎永远无法控制渲染的基础。

最终我想拥有的是:

protected override void Render(HtmlTextWriter writer)
{

  writer.WriteBeginTag("div");
  writer.AddAttribute("class", "wrapper");
  //Render existing control
  //Control.RenderControl();
  writer.WriteEndTag("div");

}

我的问题是,这是否可能,如果是这样,我做了一些明显错误的事情。任何建议或帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您需要使用ControlAdapter类而不是WebControlAdapter,请参阅下文。 使用WebControlAdapter的问题在于它通过调用RenderBeginTag,RenderContents和RenderEndTag来呈现控件。 https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.adapters.webcontroladapter%28v=vs.110%29.aspx

但是在复选框的情况下,RenderContents不是生成内容的内容,而是Render方法。并且在使用ControlAdapter类时执行控件的Render方法。 https://msdn.microsoft.com/en-us/library/system.web.ui.adapters.controladapter%28v=vs.110%29.aspx

public class RadioButtonAdapter : System.Web.UI.Adapters.ControlAdapter {
    protected override void BeginRender(HtmlTextWriter writer) {
        writer.Write("<div class=\"wrapper\">");
        base.BeginRender(writer);
    }
    protected override void EndRender(HtmlTextWriter writer) {
        base.EndRender(writer);
        writer.Write("</div>");
    }
}