Как следует использовать интерфейс IParserAccessor в пользовательских элементах управления ASP.NET - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь написать шаблон пользовательского элемента управления в C #, ASP.NET, который будет иметь коллекцию элементов.Я хотел бы использовать его аналогично встроенному элементу управления DropDownList в ASP.NET, но мои элементы будут иметь разные свойства.

Я заметил, что класс ListItem, который используется для представления элементов в элементе управления DropDownList (или любом элементе управления списком), реализует интерфейс IParserAccessor.Когда я должен реализовать этот интерфейс и что мне делать в его AddParsedSubObject(object obj).Я искал в Интернете, но я не смог найти пример или хорошее объяснение для этого.

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

1 Ответ

2 голосов
/ 27 июля 2011

Вам не нужно реализовывать IParserAccessor, чтобы получить такую ​​функциональность, о которой вы говорите. Вместо этого создайте коллекцию для хранения дочерних элементов управления (мы назовем ее «Предметы») в вашем серверном элементе управления и примените атрибут ParseChildren к своему элементу управления сервером со значением «Элементы» в качестве значения DefaultProperty.

Следующая ссылка содержит пример того, как реализовать ParseChildren:
http://msdn.microsoft.com/en-us/library/aa310907(v=vs.71).aspx

Обновление
Информация о IParserAccessor:

От: http://msdn.microsoft.com/en-us/library/system.web.ui.iparseraccessor.aspx

Поскольку класс Control реализует этот интерфейс, легче расширить этот класс и переопределить его реализацию AddParsedSubObject метод, чем реализовать этот интерфейс самостоятельно.

От: http://forums.asp.net/t/879797.aspx/1 (см. Пост создателя изображения):

AddParsedSubObject является единственным методом IParserAccessor интерфейс. Интерфейс IParserAccessor реализуется с помощью Control и все классы, наследуемые от Control, а также класс ListItem. Когда дочерние элементы управления или элементы серверных элементов управления, которые реализуют Интерфейс IParserAccessor анализируется из HTML, Метод AddParsedSubObject вызывается с помощью следующего метода подпись следует:

VB - Sub AddParsedSubObject (ByVal obj As Object)
C # - void AddParsedSubObject (object obj)

Параметр obj представляет объект это было проанализировано. В вашем собственном сервере элементы управления переопределены Метод AddParsedSubObject, вы можете проверить тип объекта затем привести и обработать его соответственно, например, как буквальный элемент управления или как определенный дочерний элемент, добавив его в дочерние элементы управления коллекция, коллекция предметов или что-то еще.

Вот пример из того же поста:

Где я впервые столкнулся с реализацией IParserAccessor интерфейс и AddParsedSubObject были в определении класса для дочерний элемент, который должен содержать в качестве внутреннего содержимого строку:

<WESNet:StyledList id="StyledList1" runat="server">    
<WESNet:StyledItem Value="2" ForeColor="red">Two</WESNet:StyledItem>  
<WESNet:StyledItem Value="5"
ForeColor="green">Five</WESNet:StyledItem></WESNet:StyledList>Because

мой класс StyledItem не наследовал от Control, мне пришлось реализовать IParserAccessor и его AddParsedSubObject следующим образом:

Protected Sub AddParsedSubObject(ByVal obj As Object) Implements IParserAccessor.AddParsedSubObject
   If TypeOf obj Is LiteralControl Then
         Me.Text = CType(obj, LiteralControl).Text
   Else
        Throw New ArgumentException("Inner content of StyledItem must contain only static text")
   End If
End Sub

Затем в моем классе StyledList (который унаследован от WebControl) мне нужно было переопределить его Метод AddParsedSubObject выглядит следующим образом:

Protected Overrides Sub AddParsedSubObject(ByVal obj As Object)
   If TypeOf obj Is StyledItem Then
         Dim si As StyledItem = CType(obj, StyledItem)
         Items.Add(si)
   Else
         Throw New ArgumentException ("A StyledList server control may contain only StyledItems")
   End If
End Sub

Здесь, после проверки того, что obj является StyledItem, он добавляется в Коллекция предметов контроля.

...