我有一个母版页,其中包含一个DropDownList
. 我有一个绑定主列表的功能,它工作正常。
我的问题是:我将如何从不是上述母版页的子表单的表单中调用该母版页函数
请参阅此处的文章。
这是 ASP.NET 2.0 中新的编译模型带来的好处。假设您将自定义属性添加到母版页代码隐藏文件,如下所示:
partial class otcMaster : System.Web.UI.MasterPage
{
public string FooterText {
get { return Footer.Text; }
set { Footer.Text = value; }
}
}
您可以使用继承的 Master 属性访问 Web 表单的母版页,该属性返回 MasterPage 引用。但是,要访问 otcMasterPage 中定义的属性,您可能认为需要使用强制转换。
((otcMaster)Master).FooterText == "foo"
在使用框架和静态类型语言时,转换为派生类型只是生活的一部分,但有更好的方法。在 ASPX 中使用 @MasterType 指令。
<%@ MasterType VirtualPath="~/otc.master" %>
现在,当 ASP.NET 对页面进行代码生成时,它会将以下内容放入部分类定义中。请注意 Shadows 关键字(这将是分号区域中的新关键字 [是的,我正在尝试其他语言])。
public new otc Master {
get { return (otcMaster)base.Master; }
}
结果是一个强类型的母版页。我们不需要演员表,我们可以直接进入 Master.FooterText 属性。另一种方法是在 @MasterType 指令中指定一个 TypeName。
在您的 中提供一个公共方法MasterPage
,然后您需要将 ContentPage 的Master
属性转换为适当的类型:
public void DataBindDropDowns()
{
// ...
}
然后您可以通过以下方式从您的 ContentPages 调用它(假设您的母版页的类型称为SiteMaster
:
((SiteMaster)this.Page.Master).DataBindDropDowns();
编辑:
...这不是上述母版页的子级
我想这意味着它不是ContentPage
那个大师的,对吗?那么除了以下情况外,就不可能获得对 master 的引用:
HTTP-Handler
是另一个不使用该母版的页面请注意,母版页实际上是 a 的子页ContentPage
,并将与其合并。不可能获得对不存在的对象的引用!
来自MSDN:
请注意,母版页成为内容页的一部分。实际上,母版页的行为方式与用户控件的行为方式非常相似——作为内容页面的子页面和该页面中的容器。
将其放入您的页面代码中(其中 MyMasterPage 是您的母版页对象):
MyMasterPage masterPage = (MyMasterPage) this.Master;
masterPage.MyBindDropDownListFunction(); // Replace with your public function name
您需要参考 MasterPage 属性,转换为您的母版页类型并调用您的方法。
((MyMasterPage)this.Master).MyBindingFunction();
为了更好的设计,使用 EventAggregator 模式。创建您的自定义事件并在母版页中处理它。
如果您经常使用它,您可以创建一个BasePage
派生自System.Web.UI.Page
,并将其用作表单的包页。
在那里,您可以添加母版页类型的属性,这将使您可以访问母版页的所有公共成员。
如果你的母版页类是Site1
,你可以在你的BasePage
.
public class BasePage : System.Web.UI.Page
{
protected Site1 Site1Master
{
get { return Master as Site1; }
}
}
然后在需要访问母版页方法的页面中替换:
public partial class DefaultPage : System.Web.UI.Page
和
public partial class DefaultPage : BasePage
然后,您将在页面中拥有可用的属性 Site1Master,并且您可以像这样使用它的任何公共成员:
Site1Master.MyBindingFunction(...);
您还可以在 BasePage 中添加任何其他所需的功能。
注意:如果要确保页面中的属性不为空,可以添加检查以查看页面是否具有Site1
母版,如下所示:
protected Site1 Site1Master
{
get
{
if (!(Master is Site1))
throw new Exception("This page doesn's have Site1 as master page");
return Master as Site1;
}
}
为了访问母版页的成员,页面内容上公开了一个 Master 属性。首先,您必须指定 @MasterType 指令:
<%@ Page masterPageFile="~/MasterPage.master"%>
<%@ MasterType virtualPath="~/MasterPage.master"%>
然后在母版页中创建一个公共功能,在您的内容页中,您只需调用
Master.MethodNameInMaster()