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

时间:2020-03-05 18:38:41  来源:igfitidea点击:

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

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

下面是我想做的一个示例,但是编译器错误提示

"PeopleListView does not exist in the current context"

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中此类问题的最佳方法是什么?

解决方案

回答

假设母版页名为MyMaster:

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

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

回答

我相信我们可以使用this.Master.FindControl或者类似的方法来做到这一点,但我们可能不应该要求内容页面对母版页的结构了解太多。

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

回答

假设该控件在母版页上称为" PeopleListView"

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

但是@palmsey更正确,特别是如果页面可能有多个母版页的可能性。解耦它们并使用一个事件。

回答

要记住的一个想法是以下ASP.NET指令。

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

MSDN参考

通过创建对母版页的强类型引用,在引用this.Master时将为我们提供帮助。然后,我们无需CAST就可以引用ListView。