我已经搜索了该网站,但找不到解决我的问题的方法,如果已经有人回答,我深表歉意(我相信之前一定有人问过这个问题)。
我编写了一个 jQuery 弹出窗口,并将其打包为 WebControl 和 IScriptControl。最后一步是能够在我的控件的标记内编写标记。我已经使用了几次 InnerProperty 属性,但仅用于包含强类型类的列表。
这是我在 WebControl 上的属性:
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public something??? Content
{
get
{
if (_content == null)
{
_content = new something???();
}
return _content;
}
}
private something??? _content;
这是我所追求的 HTML 标记:
<ctr:WebPopup runat="server" ID="win_Test" Hidden="false" Width="100px" Height="100px"
Modal="true" WindowCaption="Test Window" CssClass="window">
<Content>
<div style="display:none;">
<asp:Button runat="server" ID="Button1" OnClick="Button1_Click" />
</div>
<%--Etc--%>
<%--Etc--%>
</Content>
</ctr:WebPopup>
不幸的是,我不知道我的 Content 属性应该是什么类型。我基本上需要复制 UpdatePanel
的 ContentTemplate
。
编辑:所以下面允许自动创建一个模板容器,但没有显示控件,我在做什么有什么问题吗?
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ITemplate Content
{
get
{
return _content;
}
set
{
_content = value;
}
}
private ITemplate _content;
EDIT2:覆盖 CreateChildControls 允许呈现 ITemplate 中的控件:
protected override void CreateChildControls()
{
if (this.Content != null)
{
this.Controls.Clear();
this.Content.InstantiateIn(this);
}
base.CreateChildControls();
}
不幸的是,我现在无法从文件上的代码隐藏文件访问 ITemplate 中的控件。 IE。如果我这样在标记内放置一个按钮:
<ctr:WebPopup runat="server" ID="win_StatusFilter">
<Content>
<asp:Button runat="server" ID="btn_Test" Text="Cannot access this from code behind?" />
</Content>
</ctr:WebPopup>
然后我无法从后面的代码访问 btn_Test
:
protected void Page_Load(object sender, EventArgs e)
{
btn_Test.Text = "btn_Test is not present in Intellisense and
is not accessible to the page. It does, however, render correctly.";
}
EDIT3:已修复!编辑 2 是正确的解决方案。只是 Visual Studios 2010 是个屁股疼。关闭应用程序并重新打开它,Content 属性中的所有控件都可以在页面上访问。
EDIT4:编辑 2 没有解决问题。在有人提到它之前,我已经尝试过 [TemplateInstance(TemplateInstance.Single)]
属性,但是当时我认为它没有什么不同。看来 Visual Studios 2010 今天很奇怪。
由于我删除了标签并且它继续工作,所以我认为该属性没有产生任何影响。由于再次回到代码,控件已变得不可用。重新添加属性允许它全部工作并且控件可以在服务器端访问。 疯狂。我将接受 Brian 的回答,因为他先于其他人提到了修复。
最佳答案
公共(public) ITemplate 内容
然后将其呈现给 UI,如下所示:
Label label = new Label();
this.Content.InstantiateIn(label);
//Render label
编辑:确保模板也定义了
[TemplateInstance(TemplateInstance.Single)]
因为这允许您直接访问模板中的控件。
关于asp.net - 如何在 ASP.Net WebControl 的 'Content' 内部属性中包含其他标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2745886/