如何从动态加载的用户控件访问post值

本文关键字:控件 访问 post 用户 动态 加载 | 更新日期: 2023-09-27 18:26:59

我在动态加载的用户控件上有一个基本的TextBox。我想好了如何将值推送到这个TextBox。我遇到的问题是,我无法从这个TextBox中获取输入的值。

我必须创建一个类来向动态加载的控件传递变量。我称之为PBUserControl。

public class PBUserControl : UserControl
{
    public IList<NVP> NameValuePairs { get { return _NameValuePairs; } }
    public class NVP
    {
        public NVP() { }
        public NVP(string name, string value)
        {
            this.Name = name;
            this.Value = value;
        }
        public string Name { get; set; }
        public string Value { get; set; }
    }
}

这对于将数据发送到用户控件似乎很有效。

我的动态加载用户控件:

public partial class Basic : PBUserControl 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (this.IsPostBack == false)
        {
            this.InitializeControl();
        }
        else
        {
            this.ProcessSubmit();
        }
    }
    private void InitializeControl()
    {
        DynamicLiteral.Text = "Some Dynamic Content. " + GetNameValue("TestContent");
        TestTextBox.Text = GetNameValue("Test");
    }
    private void ProcessSubmit()
    {
        AddNameValuePair("TestContent", "Passing back some value... "+ DynamicLiteral.Text);
        AddNameValuePair("Test", TestTextBox.Text);
    }
}

以下是调用并包含此动态加载控件的页面:

public partial class PageAddEdit : PageBase
{
    private PBUserControl _PBUserControl;
    protected void Page_Load(object sender, EventArgs e)
    {
        // Must always desigante the control here else it dissapears.
        Control TemplateUserControl = LoadControl("~/Administrator/PageBuilder/Templates/Basic.ascx");
        _PBUserControl = (PBUserControl)TemplateUserControl;
        _PBUserControl.AddNameValuePair("TestContent", "It is working!!!!!!!!!");
        _PBUserControl.AddNameValuePair("Test", "Some test text.");
        Template.Controls.Add(TemplateUserControl);
    }
    protected void MenuGroupRadMenu_Clicked(object sender, EventArgs e)
    {
        IList<PBUserControl.NVP> nvp = _PBUserControl.NameValuePairs;
    }
}

让我解释一下这里发生了什么。我可以从主页面设置PBUserControl中的值。它完美地传递到动态加载的用户控件中。做它应该做的事。效果很好。

但是,在处理回发变量之前,将触发动态加载控件中的page_load事件。因此,在这一点上,TextBox的内容甚至还没有被读取。我通过研究发现了这一点。此外,如果我将Pre_Rendered事件放在动态加载的控件中,我可以在使用调试器遍历代码时看到TextBox的值。此外,使用调试器,我可以看到在Page_Load事件期间没有读取TextBox。我的研究使我得出以下结论:1.调用Page_Init事件2.调用Page_Load事件3.读取并处理页面表单变量(不确定是什么事件)4.用户事件称为ie:OnClick5.调用Pre_Rendered事件。

我需要能够创建一个将在步骤3之后、步骤4之前或期间调用的事件。这样,我就可以捕获TextBox值,并在PBUserControl.NVP变量中设置它的值,以便主页面可以读取它。如果我在PBUserControl.NVP变量中手动设置一个值,它会被主页面看到,并且读取得很好。

提前谢谢。

如何从动态加载的用户控件访问post值

我想通了!!!!基本上,我创建了一个事件,并将其从动态加载的UserControl传递给MainUserControl。以下是我为使其发挥作用所做的更改。快速解释,这样每个人都可以了解它的工作原理。我有一个名为PBUserControl的外部包装器,它允许我通过继承来创建一些元素。背后的想法是允许我来回传递数据,显然是一个事件。当动态加载子控件时,您不再能够轻松地绑定元素或事件。PBUserControl类创建了一个公共绑定,使其能够工作。就我的目的而言,它的设置理想地适用于如何在后端设置数据结构。因此,为了让它为你工作,需要进行调整。但这应该被证明是一个易于理解的概念。

我能够将动态控件中的操作注册到位于PBUserControl中的ControlSubmittedHandler。

我可以通过ControlSubmittedDelegate将ControlSubmittedTHandler分配到本地事件中,从而在父控件中注册来自动态控件的操作。在这一点上,我能够触发该事件。

足够的解释,以下是使其工作的代码更改:

我在类PBUserControl中添加了以下内容:

public delegate void ControlSubmittedDelegate(object sender, EventArgs e);
public System.EventHandler ControlSubmittedHandler;

在我的动态加载控件中,我将Page_Load事件更改为:

protected void Page_Load(object sender, EventArgs e)
{
    InitializeControl();
    this.ControlSubmittedHandler = new EventHandler(ControlSubmittedAction);
}

在我的动态加载控件中,我添加了:

public void ControlSubmittedAction(object sender, EventArgs e)
{
    ProcessSubmit();
}

在我的主要控制范围内,我添加了:

private PBUserControl _PBUserControl;
private event PBUserControl.ControlSubmittedDelegate myEvent;

在我的主要控制范围内,我改变了:

protected void MenuGroupRadMenu_Clicked(object sender, EventArgs e)
{
    myEvent = new PBUserControl.ControlSubmittedDelegate(_PBUserControl.ControlSubmittedHandler);
    if (myEvent != null) myEvent(this, e);
    IList<PBUserControl.NVP> nvp = _PBUserControl.NameValuePairs;
}