Пользовательский контроль Asp.net с внутренним контролем - PullRequest
1 голос
/ 03 марта 2011

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

WmlCard.ascx

<asp:PlaceHolder ID="phContent" runat="server">
<card id="<%= Me.CardId %>" title="<%= Me.Title %>"> 
<p>
    <%= Me.InnerText %>
</p>
</card>
</asp:PlaceHolder>

Это будет использовано так:
ListaTelefonica.aspx

<%@ Register TagPrefix="sic" TagName="Card" Src="~/path/to/WmlCard.ascx"%>    
<sic:Card ID="BuscaCard" runat="server" CardId="busca" title="Lista Telefônica" Visible="false">
   <asp:Literal ID="SomeLiteral" runat="server" Visible="false">Some text<br /></asp:Literal>
   <asp:Literal ID="RuntimeFilledLiteral" runat="server" Visible="false" /><br /></asp:Literal>
   Any text.
</sic:Card>

К сожалению, пользовательские элементы управления Ascx должны наследовать System.Web.UI.UserControl. Например, если бы я мог унаследовать System.Web.UI.WebControls.WebControl, это был бы кусок пирога.

Моя проблема похожа на эту , но вместо простого текста элемент управления должен принимать любой другой элемент управления внутри него.


Я попытался <ParseChildren(False)> и переопределил AddParsedSubObject(Object) в WmlCard, но это не решение, потому что HTML-код отображается перед загрузкой страницы, что делает бессмысленным изменение значения RuntimeFilledLiteral.Text в Page_Load страницы, например.

Первая ошибка, которую я получил:
Сообщение об ошибке синтаксического анализатора: введите 'ASP.sic_sicphone_usercontrol_wmlcard_ascx' не имеет открытого свойства с именем «Literal».

После добавления <PersistenceMode(PersistenceMode.InnerDefaultProperty), ParseChildren(True, "InnerText")>:
Свойство 'InnerText' 'sic: Card' не допускает дочерние объекты.

То же, что и выше, но изменение свойства InnerText типа WmlCard с String на List(Of Object):
Дословный контент («Любой текст.») Не допускается в «System.Collections.IList».

После добавления <ParseChildren(False)> и переопределения AddParsedSubObject:
Нет сообщения об ошибке, но содержимое WmlCard отображается в html, прежде чем у меня есть возможность изменить свойства среды его внутреннего управления.

Если я заменю WmlCard на наследование System.Web.UI.WebControls.PlaceHolder вместо System.Web.UI.UserControl:
'... UserControl.WmlCard' здесь не допускается, поскольку он не расширяет класс 'System.Web.UI.UserControl'.

Ответы [ 3 ]

3 голосов
/ 03 марта 2011

Найден правильный путь:

1) Ничего не кладите в мой элемент управления (WmlCard.ascx).

2) Добавлен атрибут <ParseChildren(False)> в WmlCard.

3) Добавлен обработчик события PreRender на WmlCard:

Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
  Dim litBefore As New Literal()
  litBefore.Text = String.Format("<card id=""{0}"" title=""{1}""><p>", Me.CardId, Me.Title)

  Dim litAfter As New Literal()
  litAfter.Text = "</p></card>"

  Me.Controls.AddAt(0, litBefore)
  Me.Controls.Add(litAfter)
End Sub

И все.Все работает.Спасибо за вашу помощь, продумав это!

0 голосов
/ 03 марта 2011

На самом деле вы можете создать пользовательский элемент управления, наследовать от заполнителя, и ваша проблема должна быть решена?

Вы можете пойти по шаблону, как предложено, но я не вижу причины, по которой вы хотели бысделай это.

 [SupportsEventValidation, DefaultEvent("YourEventName")]
    [ParseChildren(true)]
    [PersistChildren(false)]
    [ToolboxBitmap(typeof(System.Web.UI.WebControls.Panel))]
    public class MyCustomControl : System.Web.UI.WebControls.PlaceHolder, INamingContainer, IPostBackDataHandler, IPostBackEventHandler

вы можете переопределить метод Render для управления отображаемым HTML.Я изо всех сил пытаюсь увидеть вашу настоящую проблему.

0 голосов
/ 03 марта 2011

Вам нужен шаблонный элемент управления.

Ознакомьтесь с этой статьей для получения подробных инструкций: http://msdn.microsoft.com/en-us/library/36574bf6.aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...