这是与我发布的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
}
}
没有适配器
如果不使用控制适配器,我的单选按钮显然可以正常显示。
适配器
添加我的控制适配器并更改其他内容,我得到了意外的行为:
我尝试添加调用以进行基本控件渲染,例如
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");
}
我的问题是,这是否可能,如果是这样,我做了一些明显错误的事情。任何建议或帮助将不胜感激。
答案 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>");
}
}