Мой основной вопрос в .NET: как клонировать WebControls?
Я хотел бы создать собственный тег, который может создавать несколько копий своих дочерних элементов. В конечном итоге я намерен создать тег, аналогичный тому, что есть в JSP / Struts.
Но первое препятствие, которое у меня есть, - это возможность дублировать / клонировать содержимое элемента управления.
Рассмотрим этот довольно надуманный пример;
<custom:duplicate count = "2">
<div>
<p>Some html</p>
<asp:TextBox id = "tb1" runat = "server" />
</div>
</custom:duplicate>
Разметка HTML, которая выводится, будет выглядеть примерно так:
<div>
<p>Some html</p>
<input type = "text" id = "tb1" />
</div>
<div>
<p>Some html</p>
<input type = "text" id = "tb1" />
</div>
Примечание: я знаю, что у меня дублирован идентификатор, я могу придумать решение этого позже!
Итак, у нас будет мой настраиваемый элемент управления с 3 дочерними элементами (я думаю) - буквальный элемент управления, элемент управления TextBox и еще один буквальный элемент управления.
В этом примере я сказал «count = 2», поэтому элемент управления должен дважды выводить / визуализировать своих дочерних элементов.
Я бы хотел написать код "OnInit", который делает что-то вроде:
List<WebControl> clones;
for(int i=1; i<count; i++)
{
foreach(WebControl c in Controls)
{
WebControl clone = c.Clone();
clones.Add(clone);
}
}
Controls.AddRange(clones);
Однако, насколько я могу судить, WebControls не реализуют ICloneable, поэтому клонировать их таким образом невозможно.
Есть идеи, как я могу клонировать WebControls?





В ASP.NET это можно сделать с помощью шаблонов. Для этого в MSDN есть образцы, просто поищите шаблонные элементы управления / ITemplate.
Что не так с использованием повторителя и привязкой источника данных с ошибкой. Он будет дублировать шаблонные элементы управления и обрабатывать создание идентификатора и все такое.
Просто как справочник для тех, кто действительно хочет клонировать настраиваемый серверный элемент управления.
public class MyCustomServerCtrl
{
...
public MyCustomServerCtrl Clone()
{
return MemberwiseClone() as MyCustomServerCtrl;
}
}
Но обратите внимание: это требуется очень редко, и если да, то, скорее всего, именно тогда, когда у вас есть какая-то действительно конкретная логика. По возможности этого следует избегать. Обычно достаточно использовать существующие элементы управления, такие как Repeater, ListView и т. д.
Метод WebControl.CopyBaseAttributes копирует свойства AccessKey, Enabled, ToolTip, TabIndex и Attributes из указанного серверного веб-элемента управления в серверный веб-элемент управления, из которого вызывается этот метод.
Я действительно использовал его, поэтому я рад, что вы опубликовали это в целях документации. Всего 7 лет понадобилось, чтобы кто-то нашел его! :)