Настраиваемый пользовательский элемент управления и удобная коллекция элементов свойств (например, ListBox и ListItems, но со списком ‹Class›) на .ASPX

Я давно задавался вопросом, как сделать общедоступное свойство для пользовательского элемента управления, которое работает как Собственное свойство коллекции элементов .NET (например, ListBox и ListItems):

<asp:ListBox blablabla>
    <asp:ListItem></asp:ListItem> <- Inline item collection...
</asp:ListBox>

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

Мне пришлось поработать над настраиваемым пользовательским элементом управления, но Visual Studio не распознала его как допустимую коллекцию элементов.

Допустим, у нас есть этот userControl:

public partial class userControls_Blablabla : System.Web.UI.UserControl
{
  public List<configItem> ConfigItem {get; set; }

  blablabla...rest logic here...
}

public class configItem {
   public string Name {get; set;}
   public string Url {get; set;}
   public string Color {get; set;}

  blablabla...rest logic here...
}

Как это сделать, чтобы иметь возможность делать что-то подобное в редакторе .ASPX Visual Studio, и это распознается Intellisense?

<User_Control:userControls_Blablabla ID="blablabla" ...blablabla....>
   <ConfigItem Name="1" Url="...." Color="..." />
   <ConfigItem Name="2" Url="...." Color="..." />
   <ConfigItem Name="3" Url="...." Color="..." />
</User_Control:userControls_Blablabla>

Извините за мой английский, я знаю, что он не очень хороший.

Заранее спасибо!


person Pablo HDG    schedule 22.12.2011    source источник


Ответы (3)


Вам необходимо украсить элемент управления и его свойства достаточной информацией, которую дизайнер может уловить во время разработки. Вы проверяли эту ссылку?

person ChrisBD    schedule 22.12.2011
comment
Привет, ChrisBD! Проблема заключалась в том, что разработчик не распознал объект настраиваемого класса как внутреннее свойство, поэтому он говорил мне, что я не могу шагать по любому элементу внутри тега открытия / закрытия. Мне просто нужно разместить, как сказал wnascimiento, атрибут [PersistenceMode (PersistenceMode.InnerProperty)]. Спасибо за все! Я надеюсь, что эта ветка поможет другим людям вроде меня :). - person Pablo HDG; 22.12.2011


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

Создайте классы, как описано - вместо этого, если рендеринг я переопределяю метод OnInit, так как он вызывается раньше, и я могу еще немного поиграть с другой опорой. Создайте 2 пространства имен:

namespace x.Controls.Conference - add the class that derives from UserControl
{ 
    public partial class SlideShow : System.Web.UI.UserControl{...}
}

namespace x.Controls.Conference.SlideShowUC - add here the base class of the collection item in the UC (Collection<Slide>)
{
 public class Slide{...}
 public class SlideCollectionEditor : CollectionEditor{...}
}

Теперь вы можете напрямую зарегистрировать их на своих aspx-страницах или в веб-конфигурации, в зависимости от того, как часто вы будете использовать элемент управления.

ВЕБ КОНФИГУРАЦИЯ

<add tagPrefix="ucSlideShow" tagName="SlideShow" src="~/x/Controls/Conference/SlideShow.ascx" />
<add tagPrefix="ucSlideShow" namespace="x.Controls.Conference.SlideShowUC" assembly="WebAssembly" />

СТРАНИЦА

<%@ Register TagPrefix="ucSlideShow" TagName="SlideShow" src="~/x/Controls/Conference/SlideShow.ascx"  %>
<%@ Register TagPrefix="ucSlideShow" namespace="x.Controls.Conference" assembly="WebAssembly"  %>
person JJschk    schedule 30.10.2012