Программное добавление пользовательских элементов управления внутри UpdatePanel

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

Можете ли вы опубликовать код, с помощью которого вы пытаетесь это сделать?

Lou Franco 18.10.2008 03:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
1
23 150
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я думаю, что это одна из распространенных ловушек для программистов asp.net, но на самом деле не так уж и сложно сделать это правильно, когда вы знаете, что происходит (всегда помните свое состояние просмотра!).

следующий фрагмент кода объясняет, как это можно сделать. Это простая страница, на которой пользователь может щелкнуть меню, которое вызовет действие, добавляющее пользовательский элемент управления на страницу внутри панели обновлений. (Этот код заимствован отсюда и содержит много дополнительной информации по этой теме)

<%@ Page Language = "C#" AutoEventWireup = "true" CodeFile = "SampleMenu1.aspx.cs" Inherits = "SampleMenuPage1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml" >
<head runat = "server">
    <title>Sample Menu</title>
</head>
<body>
    <form id = "form1" runat = "server">
        <asp:Menu ID = "Menu1" runat = "server" OnMenuItemClick = "Menu1_MenuItemClick">
            <Items>
                <asp:MenuItem Text = "File">
                    <asp:MenuItem Text = "Load Control1"></asp:MenuItem>
                    <asp:MenuItem Text = "Load Control2"></asp:MenuItem>
                    <asp:MenuItem Text = "Load Control3"></asp:MenuItem>
                </asp:MenuItem>
            </Items>
        </asp:Menu>
        <br />
        <br />
        <asp:ScriptManager ID = "ScriptManager1" runat = "server"></asp:ScriptManager>
        <asp:UpdatePanel ID = "UpdatePanel1" runat = "server" UpdateMode = "Conditional">
            <ContentTemplate>
                <asp:PlaceHolder ID = "PlaceHolder1" runat = "server"></asp:PlaceHolder>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID = "Menu1" />
            </Triggers>
        </asp:UpdatePanel>
    </form>
</body>
</html>

и

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class PlainSampleMenuPage : System.Web.UI.Page
{
    private const string BASE_PATH = "~/DynamicControlLoading/";

    private string LastLoadedControl
    {
        get
        {
            return ViewState["LastLoaded"] as string;
        }
        set
        {
            ViewState["LastLoaded"] = value;
        }
    }

    private void LoadUserControl()
    {
        string controlPath = LastLoadedControl;

        if (!string.IsNullOrEmpty(controlPath))
        {
            PlaceHolder1.Controls.Clear();
            UserControl uc = (UserControl)LoadControl(controlPath);
            PlaceHolder1.Controls.Add(uc);
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        LoadUserControl();
    }

    protected void Menu1_MenuItemClick(object sender, MenuEventArgs e)
    {
        MenuItem menu = e.Item;

        string controlPath = string.Empty;

        switch (menu.Text)
        {
            case "Load Control2":
                controlPath = BASE_PATH + "SampleControl2.ascx";
                break;
            case "Load Control3":
                controlPath = BASE_PATH + "SampleControl3.ascx";
                break;
            default:
                controlPath = BASE_PATH + "SampleControl1.ascx";
                break;
        }

        LastLoadedControl = controlPath;
        LoadUserControl();
    }
}

для кода позади.

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

Более подробную информацию также можно найти здесь:

и, конечно же, я использовал здесь веб-сайт, содержащий пример кода.

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

1) Используйте LoadViewstate вместо Page_Load для загрузки пользовательского элемента управления:

protected override void LoadViewState(object savedState)
{
    base.LoadViewState(savedState);

    if (!string.IsNullOrEmpty(CurrentUserControl))
        LoadDataTypeEditorControl(CurrentUserControl, panelFVE);
}

2) Не забудьте установить идентификатор элемента управления при загрузке пользовательского элемента управления:

private void LoadDataTypeEditorControl(string userControlName, Control containerControl)
{
    using (UserControl myControl = (UserControl) LoadControl(userControlName))
    {
        containerControl.Controls.Clear();

        string userControlID = userControlName.Split('.')[0];
        myControl.ID = userControlID.Replace("/", "").Replace("~", "");
        containerControl.Controls.Add(myControl);
    }
    this.CurrentUserControl = userControlName;
}

Попробуй это:

Literal literal = new Literal();
literal.Text = "<script type='text/javascript' src='http://www.googleadservices.com/pagead/conversion.js'>";
UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);

Вы можете заменить содержимое литерала любым содержимым HTML, которое хотите ...

Другие вопросы по теме