Asp: оберните ITemplate детей с дополнительным HTML - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь создать пользовательский элемент управления, который дополняет элементы управления, предоставляемые страницей 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.Это также работает, только если видимость элементов управления в «Элементах» не изменяется динамически.

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

...