Пользовательский элемент управления и коллекция элементов дружественных свойств (например, ListBox и ListItems, но со списком <Class>) в .ASPX - PullRequest
4 голосов
/ 22 декабря 2011

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

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

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

Ответы [ 3 ]

4 голосов
/ 22 декабря 2011

Вы можете разместить список своего типа в классе элемента управления и украсить с помощью PersistenceModeAttribute.

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

Лучший пример:

http://am -blog.no-ip.org / BlogEngine / пост / 2010/04/13 / ASP-NET-заказ-Control-с-PersistenceModeInnerProperty-использованием-Server-Controls.aspx

1 голос
/ 22 декабря 2011

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

0 голосов
/ 30 октября 2012

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

WEB CONFIG

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

PAGE

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