我搜索了网站,但找不到我的问题的解决方案,所以如果已经得到解答就道歉(我敢肯定以前有人问过这个问题)。
我编写了一个jQuery Popup窗口,我将其打包为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
的{{1}}。
编辑:所以以下内容允许自动创建一个模板容器,但是没有控件出现,我正在做什么错了?
ContentTemplate
EDIT2 :覆盖CreateChildControls可以呈现ITemplate中的控件:
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ITemplate Content
{
get
{
return _content;
}
set
{
_content = value;
}
}
private ITemplate _content;
不幸的是,我现在无法从文件的代码隐藏文件访问ITemplate中的控件。即如果我在我的标记内按下按钮:
protected override void CreateChildControls()
{
if (this.Content != null)
{
this.Controls.Clear();
this.Content.InstantiateIn(this);
}
base.CreateChildControls();
}
然后,我无法从后面的代码中访问<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
EDIT3 :已修复!编辑2是正确的解决方案。只是Visual Studios 2010是臀部疼痛。关闭应用程序并重新打开它,并且可以在页面上访问Content属性中的所有控件。
EDIT4 :编辑2没有解决问题。在任何人提到它之前我已经尝试了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.";
}
属性,但当时我并不认为它有所作为。看来Visual Studios 2010今天很奇怪。
由于我删除了标签并继续工作,我认为该属性没有任何区别。由于返回代码AGAIN,控件已无法使用。重新添加属性允许它全部工作,并且控件可以在服务器端访问。的 MADNESS 即可。我将接受Brian的答案,因为他在其他人面前提到了这个问题。
答案 0 :(得分:5)
公共ITemplate内容
然后您将其渲染到UI,如:
Label label = new Label();
this.Content.InstantiateIn(label);
//Render label
编辑:确保模板也定义
[TemplateInstance(TemplateInstance.Single)]
因为这允许您直接访问模板中的控件。
答案 1 :(得分:1)
你应该尝试使用它:
win_StatusFilter.FindControl("btn_Test") // this will be a Control
win_StatusFilter.FindControl("btn_Test") as Button // this will be a Button if control found, otherwise it will be null.
否则,您应该为控件定义一些属性,如本文所示: http://msdn.microsoft.com/ru-ru/library/36574bf6%28v=VS.90%29.aspx
更新: 根据本文中关于UpdatePanel的ContentTemplate属性的评论:
http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.contenttemplate(v=VS.90).aspx
由于TemplateInstanceAttribute值(UpdatePanel.ContentTemplate具有TemplateInstance.Single
),您可以从ContentTemplate获取控件。
所以你应该只使用这段代码:
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content
更多信息:
http://msdn.microsoft.com/ru-ru/library/system.web.ui.templateinstanceattribute(v=VS.90).aspx