4

我已经搜索了该站点,但找不到解决我的问题的方法,因此如果已经得到解答,我深表歉意(我确定之前一定有人问过这个问题)。

我编写了一个 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's 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 中的控件。即,如果我在我的标记内放置一个按钮:

<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:Edit 2 没有解决这个问题。在有人提到它之前,我已经尝试过该[TemplateInstance(TemplateInstance.Single)]属性,但是当时我认为它没有任何作用。看来 Visual Studios 2010 今天只是有点奇怪。

由于我删除了标签并继续工作,我认为该属性没有任何区别。由于再次回到代码,控件变得不可用。重新添加该属性可以使其全部正常工作,并且可以在服务器端访问控件。疯狂。我将接受布赖恩的回答,因为他在其他人之前提到了修复。

4

2 回答 2

5

公共 ITemplate 内容

然后您将其呈现给 UI,例如:

Label label = new Label();
this.Content.InstantiateIn(label);

//Render label

编辑:确保模板还定义

[TemplateInstance(TemplateInstance.Single)]

因为这允许您直接访问模板中的控件。

于 2010-04-30T16:11:42.550 回答
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 值,您可以从 ContentTemplate 获取控件(UpdatePanel.ContentTemplate 具有TemplateInstance.Single)。

所以你应该只使用这个代码:

[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

于 2010-05-04T09:28:15.540 回答