ASP.NET: возможно ли создать UserControl, включающий содержимое разметки? - PullRequest
3 голосов
/ 17 декабря 2008

Я пытаюсь достичь чего-то, что Google не может дать ответ. Я пытаюсь создать пользовательский контроль asp.net, который, когда я помещаю контент в тег open close, будет включать его, чтобы я мог по-прежнему иметь доступ к его контенту по идентификатору от родителя. Вот пример того, чего я хочу достичь.

UserControl:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ctrlGENE_CollapsiblePanel.ascx.cs"
    Inherits="Controls_GenericsControls_ctrlGENE_CollapsiblePanel" %>
<asp:Panel ID="pnlHeader" CssClass="SnapPanelHeader" runat="server">
    <h3>
        <asp:Literal ID="litTitle" Text='<%# Text %>' runat="server" />
    </h3>
    <div class="SnapPanelHeader-img">
        <img id="imgOpenClose" src="/images/application/close.jpg" alt="" />
    </div>
</asp:Panel>
<asp:PlaceHolder runat="server" ID="pnlContent">
// **HERE I WANT TO INCLUDE THE INSIDE MARKUP**
</asp:PlaceHolder>
<act:CollapsiblePanelExtender runat="server" TargetControlID="pnlContent" ImageControlID="imgOpenClose"
    ExpandControlID="imgOpenClose" CollapseControlID="imgOpenClose" CollapsedImage="/images/application/open.jpg"
    ExpandedImage="/images/application/close.jpg" CollapsedSize="0" TextLabelID="litTitle">
</act:CollapsiblePanelExtender>

Родительская страница, включающая элемент управления:

<uc:MyUserControl ID="clpTest" runat="server">
     <asp:Literal ID="litText" runat="server" />
</uc:MyUserControl>

Вот так я мог бы сделать в файле Parent.cs:

litText.Text = "Anything";

Я знаю, что мы можем достичь чего-то похожего с интерфейсом ITemplate, как показано здесь: http://msdn.microsoft.com/en-us/library/36574bf6.aspx

Это будет выглядеть так:

<uc:MyUserControl ID="clpTest" runat="server">
     <ItemTemplate>
          <asp:Literal ID="litText" runat="server" />
     </ItemTemplate>
</uc:MyUserControl>

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

Кто-нибудь намекает на это, если я смогу достичь своей цели так или иначе?

Спасибо

Ответы [ 2 ]

3 голосов
/ 18 декабря 2008

Хорошо, я исправил это вот решение, которое я использовал:

В файле MyUserConstrol.ascx я поместил заполнитель, где я хотел, чтобы innerHTML показывал:

<asp:PlaceHolder runat="server" ID="plhContent" />

Затем в файле MyUserControl.ascx.cs я добавил эти атрибуты в класс:

[ParseChildren(false)]
[PersistChildren(true)]

И я добавил в файл это:

public void RegisterUpdatePanel(UpdatePanel panel)
{
    MethodInfo m =
        (from methods in typeof (ScriptManager).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)
         where methods.Name.Equals("System.Web.UI.IScriptManagerInternal.RegisterUpdatePanel")
         select methods).First();

    m.Invoke(ScriptManager.GetCurrent(Page), new object[] {panel});
}

protected override void CreateChildControls()
{
    for (int i = 0; i < Controls.Count; i++)
        if (Controls[i] is MyLastControl)
            while (i + 2 < Controls.Count)
            {
                // In cas there is an updatepanel in the control we are moving
                // We are registering an event to register the updatepanel
                // to the scriptmanager again
                SearchUpdatePanel(Controls[i + 2]);
                plhContent.Controls.Add(Controls[i + 2]);
            }
    base.CreateChildControls();
}

private void SearchUpdatePanel(Control control)
{
    if (control is UpdatePanel)
        control.Unload += updPnl_Unload;

    foreach (Control childcontrol in control.Controls)
        SearchUpdatePanel(childcontrol);
}

protected void updPnl_Unload(object sender, EventArgs e)
{
    RegisterUpdatePanel((UpdatePanel) sender);
}

Обратите внимание, что я назвал свой последний элемент управления в файле ascx myLastContol, чтобы узнать, каким был элемент управления до внедрения innerHTML, поскольку я не знаю, что я получаю. Процедура в основном говорит loop в элементах управления в UserControl, когда вы достигнете конца UserControl, все после является innerHTML от родительского, поэтому возьмите их и переместите их в заполнитель, где я хочу их.

Надеюсь, это кому-нибудь поможет.

Вот несколько источников, которые я использовал для достижения своей цели: Регистрация UpdatePanel

0 голосов
/ 17 декабря 2008

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

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

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