从User Control操作父页面

时间:2015-02-27 15:52:34

标签: c# asp.net webforms user-controls

我正在处理我只有二进制文件的Web应用程序。该应用程序允许通过为派生类提供内部来开发扩展。

我想要实现的是在现有的aspx页面中添加其他功能。因为我无法复制和修改相应的代码,所以我考虑开发UserControl并修改所讨论的aspx页面的标记以包含该控件。

直到现在我才成功。控件显示在页面上并触发服务器事件处理程序。它还可以访问应用程序内部数据。我现在需要的是以编程方式操作UserControl服务器端的一些原始页面元素。

我知道这不是用户控件的目的,他们不应该对parrent页面元素有任何了解。但是,据我所知,这是将一些自定义功能包含在现有页面中的唯一方法。

在我提出这个问题之前,我花了很多时间研究可用的解决方案。

请您,您能否建议在服务器端使用用户控件引用这些元素的最佳方式?

下面是我到目前为止所做的简化代码表示

现有的aspx页面:

// SOME CONTENT OF THE ORGINAL PAGE

<%@ Register TagPrefix="uc" TagName="MyControl" Src="~/usercontrols/MyControl.ascx" %>

// SOME CONTENT OF THE ORGINAL PAGE

<uc:MyControl ID="pnlMyControl" runat="server"></uc:MyControl>

// SOME CONTENT OF THE ORGINAL PAGE

我的用户控制:

public partial class MyControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //DO SOMETHING HAVING ACCESS TO INTERNAL DATA
    }

    protected void lnkTest_Click(object sender, EventArgs e)
    {
        //DO SOMETHING HAVING ACCESS TO INTERNAL DATA
    }
}

1 个答案:

答案 0 :(得分:0)

我已经做了类似的事情,虽然我已经为变量而不是控件做了这些,所以我将尝试在这里进行调整。

我使用属性来实现这一点,使用:

<%@ Register TagPrefix="uc" TagName="MyControl" Src="~/usercontrols/MyControl.ascx" %>

<uc:MyControl ID="pnlMyControl" runat="server" />

在UserControl中,您可以执行以下操作:

private string _myTextBox = new TextBox();

public string myTextBox
{
    get 
    {
        return _myTextBox;
    }
    set
    {
        _myTextBox = value;
    }
}

然后在父页面中,您可以设置这些属性;例如:

protected void Page_Load(object sender, EventArgs e)
{
    pnlMyControl.myTextBox = MyParentTextBox;
}

另外,你可能会觉得这很有用;您可以使用以下命令从用户控件直接触发父对象的方法:

this.Page.GetType().InvokeMember("MyMethodName", System.Reflection.BindingFlags.InvokeMethod, null, this.Page, new object[] { });

我希望有所帮助。