如何从内容页面访问母版页上的.Net元素?

时间:2008-08-08 21:39:04

标签: c# .net

是否可以从主页的ContentPlaceHolder中加载的页面访问母版页上的元素?

我有一个ListView,它在主页面的导航区域中列出了人物的名字。我想在将一个人添加到ListView数据绑定到的表后更新ListView。在重新加载缓存之前,ListView当前不会更新它的值。我们发现只需重新运行ListView.DataBind()即可更新列表视图的内容。我们无法在使用母版页的网页上运行ListView.DataBind()

以下是我想要做的一个示例,但编译错误说

  

“PeopleListView在当前上下文中不存在”

GIS.master - ListView所在的位置

...<asp:ListView ID="PeopleListView"...

GISInput_People.aspx - 使用GIS.master作为主页

GISInput_People.aspx.cs

AddNewPerson()
{
    // Add person to table
    ....

    // Update Person List
    PeopleListView.DataBind();
    ...
}

在C#.Net中解决此类问题的最佳方法是什么?

6 个答案:

答案 0 :(得分:16)

我相信你可以通过使用this.Master.FindControl或类似的东西来做到这一点,但你可能不应该 - 它要求内容页面过多地了解母版页的结构

我建议使用另一种方法,例如在内容区域中触发主人可以侦听的事件,并在触发时重新绑定。

答案 1 :(得分:3)

假设控制在母版页上被称为“PeopleListView”

ListView peopleListView = (ListView)this.Master.FindControl("PeopleListView");
peopleListView.DataSource = [whatever];
peopleListView.DataBind();

但@ palmsey更为正确,尤其是如果您的网页可能有多个母版页。将它们分离并使用事件。

答案 2 :(得分:2)

选项1:您可以创建母版页控件的公共属性

public TextBox PropMasterTextBox1
{
    get { return txtMasterBox1; }
    set { txtMasterBox1 = value; }
}

在内容页面上访问它,如

Master.PropMasterTextBox1.Text="SomeString";

选项2: 在母版页面上:

public string SetMasterTextBox1Text
{  
    get { return txtMasterBox1.Text; }
    set { txtMasterBox1.Text = value; }
}

在内容页面上:

Master.SetMasterTextBox1Text="someText";

选项3: 你可以创建一些适合你的公共方法


这些方法并不是那么有用,但如果您只想使用一些有限的预定义控件

,它会有所帮助

答案 3 :(得分:1)

要记住的是以下ASP.NET指令。

<%@ MasterType attribute="value" [attribute="value"...] %>

MSDN Reference

通过创建对母版页的强类型引用,它可以帮助您引用this.Master。然后,您可以在不需要CAST的情况下引用ListView。

答案 4 :(得分:0)

您可以使用您希望控制的代码this.Master.FindControl(ControlID)进行访问。它返回控件的引用,以便更改生效。每种情况都不可能发生事件。

答案 5 :(得分:-1)

假设您的母版页名为MyMaster:

(Master as MyMaster).PeopleListView.DataBind();

编辑,因为默认情况下PeopleListView将被声明为受保护,您需要将其更改为public,或者创建一个公共属性包装器,以便您可以从页面访问它。