Как я могу включить дополнительную разметку в пределах внутреннего свойства «контента» ASP.NET WebControl?

StackOverflow https://stackoverflow.com/questions/2745886

Вопрос

Я искал сайт, и я не могу найти решение для моей проблемы, поэтому извиняюсь, если она уже ответила (я уверен, что кто-то, должно быть, спросил это раньше).

Я написал всплывающее окно 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>

К сожалению, я не знаю, какой тип свойства моего контента должен быть. Я в основном нужно реплицировать UpdatePanelС. ContentTemplate.

РЕДАКТИРОВАТЬ: Также следующее позволяет автоматически создавать контейнер шаблона, но никаких элементов управления не появится, что не так с тем, что я делаю?

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ITemplate Content
{
    get
    {
        return _content;
    }
    set
    {
        _content = value;
    }
}
private ITemplate _content;

Редактировать2.: Переопределение CreateChildControls позволяет управлять элементами элементами элемента:

protected override void CreateChildControls()
{
   if (this.Content != null)
   {
      this.Controls.Clear();
      this.Content.InstantiateIn(this);
   }
   base.CreateChildControls();
}

К сожалению, я не могу добраться до доступа к элементам управления в элементарном пункте из файла CodeBehind в файле. Т.е. если я положу кнопку на мою отметку как так:

<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.";
}

Редактировать3.: ИСПРАВЛЕНО! Редактировать 2 - правильное отверстие. Это было просто Visual Studios 2010, будучи болью в ягодицах. Закрыть приложение и открывало его, и все мои элементы управления в рамках свойства Content были доступны на странице.

Редактировать4.: Edit 2 не исправлял проблему. Я уже пробовал [TemplateInstance(TemplateInstance.Single)] Атрибут, прежде чем кто-нибудь упомянул об этом, однако в то время я не думал, что это имело значение. Похоже, Visual Studios 2010 - это просто странное сегодня.

Поскольку я удалил тег, и оно несут на работе, я предположил, что атрибут не имеет значения. Поскольку снова возвращаясь к коду, элементы управления стали недоступными. Добавление атрибута обратно разрешено все это работать, и для элементов управления доступна на стороне сервера. БЕЗУМИЕ. Отказ Я буду принимать ответ Брайана, когда он упомянул починить, прежде чем кто-либо еще.

Это было полезно?

Решение

Содержание общественного элемента

Что тогда вы видите на UI, как:

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

//Render label

Редактировать: Убедитесь, что шаблон также определяет

[TemplateInstance(TemplateInstance.Single)]

Поскольку это позволяет получить доступ к элементам управления в шаблоне напрямую.

Другие советы

Вы должны попытаться использовать это:

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.


ОБНОВЛЕНИЕ: Согласно замечаниям в этой статье о Свойстве ContentTemplate Papher of UpdatePanel:

http://msdn.microsoft.com/en-us/library/system.web.ui.updatePanel.contentTemplate(v=vs.90).aspx.

Вы можете получить элементы управления от ContentTemplate из-за значения TemplateInStanceattribute (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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top