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. Это также работает, только если видимость элементов управления в "Предметах" не изменяется динамически.
Может ли кто-нибудь помочь мне с этой проблемой или предложить другой подход?