【问题标题】:Pass Data into User Control on Master Page from Sub Page从子页面将数据传递到母版页上的用户控件
【发布时间】:2012-03-27 06:31:06
【问题描述】:

我在母版页上有一个用户控件,我想从子页面向该用户控件传递一个值,我该如何传递这些值?

此控件位于母版页中

<%@ Register TagPrefix="test" TagName="Data" Src="controls/TEST.ascx" %>

此代码变量在用户控件内

public partial class Controls_TEST : System.Web.UI.UserControl
{
    private string _Title;
    public string Title
    {
        get { return _Title; }
        set { _Title = value; }
    }
}

子页面内的代码

public partial class sub_page : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
         Controls_Test m = LoadControl("~/Controls/TEST.ascx");
         m.Title = "TEST";
    }
}

请注意,子页面中的示例代码不起作用,因为它在子页面中找不到该用户控件。

我已经尝试过 Page.Master.FindControl,但它对我也不起作用。请帮忙。

【问题讨论】:

    标签: asp.net user-controls master-pages


    【解决方案1】:

    使用属性从您的Page 通信到您的MasterPage,并使用属性从您的MasterPage 通信到UserControl

    要在MasterPage 中获取对控件的引用,您应该提供一个返回它的公共属性:

    例如(在 MasterPage 中):

    public Controls_Test MyControl
    {
         get
         {
             return Controls_TEST1;
         }
    }
    

    您可以通过这种方式从您的一个 ContentPages 调用此属性(例如,如果您的主人的类型名为“SiteMaster”):

    protected void Page_Load(object sender, EventArgs e)
    {
        ((SiteMaster)Page.Master).MyControl.Title = "TEST";
    }
    

    作为经验法则:您封装的控件越多,您的代码就越健壮、防故障、可维护和可扩展。

    因此,最好只提供对 Title 的访问,而不是提供对整个 UserControl 的访问。

    MasterPage:

    public String Title
    {
         get
         {
             return Controls_TEST1.Title;
         }
        set
        {
            Controls_TEST1.Title = value;
        }
    }
    

    ContentPage

    ((SiteMaster)Page.Master).Title = "TEST";
    

    通过这种方式,您可以更改 UserControlMasterPage 中的逻辑和控件,而不会在已经直接访问 UserControl 的页面中出现问题。

    【讨论】:

    • 完美!非常感谢=D
    • +1 用于提及仅公开值而不是控件本身,因此 MasterPage 实现可以在不破坏子页面的情况下进行更改。
    • 我使用您的方法随机收到此错误,请帮助:无法将“ASP.master_twocolumn_searchresults_master”类型的对象转换为“TwoColumn_SearchResults”。
    • @Anna:你在什么时候得到这个异常? TwoColumn_SearchResults 是什么?
    • @Anna:所以你认为这是微软的错误?然后只需重新启动 IIS(或应用程序池)或编辑 web.config 以重新编译所有内容。我看不出它与这个问题有什么关系。您可能想用简化的示例提出另一个问题。 编辑等等,这里已经有一个关于 SO 的问题:stackoverflow.com/questions/512064/…Here's 另一篇有用的文章。
    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多