Asp: оберните ITemplate детей с дополнительным HTML

Я пытаюсь создать пользовательский элемент управления, который расширяет элементы управления, предоставляемые страницей ASPX хостинга с дополнительным HTML.

До сих пор я работал над тем, чтобы у меня был пользовательский элемент управления, в который можно добавить дочерние элементы управления в родительский элемент. Я также могу отобразить все эти элементы управления, например, внутри div, но я не могу добавить div для каждого ребенка в отдельности.

На родительской странице aspx определены следующие элементы:

<uc:MyUserControl runat="server">
   <Items>
      <asp:Button runat="server" />
      <asp:Button runat="server" />
   </Items>
</uc:MyUserControl>

MyNamingContainer.ascx.cs:

public class MyNamingContainer : Control, INamingContainer {}

[ParseChildren(true)]
public partial class MyUserControl : UserControl
{
   [TemplateContainer(typeof(MyNamingContainer))]
   [TemplateInstance(TemplateInstance.Single)]
   [PersistenceMode(PersistenceMode.InnerProperty)]
   public ITemplate Items { get; set; }

   protected override void OnInit(EventArgs e)
   {
      base.OnInit(e);

      var container = new MyNamingContainer();
      Items.InstantiateIn(container);
      _placeHolder.Controls.Add(container);
   }
}

MyNamingContainer.ascx:

<div>    
    <asp:PlaceHolder runat="server" ID="_placeHolder"></asp:PlaceHolder>
</div>

Результат html:

<div>
   <input ... />
   <input ... />
</div>

То, что я хотел бы достичь, это иметь что-то вроде этого:

<div>
   <div class="someClass">
      <input ... />
   </div>
   <div class="someClass">
      <input ... />
   </div>
<div>

Есть ли способ добавить эти дополнительные элементы, используя подход с ITemplate или есть другой способ решить эту проблему?

Я также попытался добавить элементы управления без ITemplate:

[PersistenceMode(PersistenceMode.InnerProperty)]
public List<Control> Items { get; set; }

Затем элементы были связаны с повторителем с заполнителем в шаблоне ItemTemplate.

<asp:Repeater runat="server" OnItemDataBound="OnRepeaterItemDataBound">
   <ItemTemplate>
      <div class="someClass">
         <asp:PlaceHolder runat="server" ID="_itemPlaceholder"> 
         </asp:PlaceHolder>
      </div>
   </ItemTemplate>
</asp:Repeater>

В "OnItemDataBound" был обнаружен заполнитель текущих элементов и заполнен DataItem. Но это приводит к проблемам, потому что элементы управления в плацдарме теряются после обратной передачи и должны быть повторно добавлены в OnInit. Это также работает, только если видимость элементов управления в "Предметах" не изменяется динамически.

Может ли кто-нибудь помочь мне с этой проблемой или предложить другой подход?

0 ответов

Другие вопросы по тегам