0

我有一个母版页,其中包含一个DropDownList. 我有一个绑定主列表的功能,它工作正常。

我的问题是:我将如何从不是上述母版页的子表单的表单中调用该母版页函数

4

7 回答 7

2

请参阅此处的文章

这是 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。

于 2012-05-21T10:25:52.603 回答
1

在您的 中提供一个公共方法MasterPage,然后您需要将 ContentPage 的Master属性转换为适当的类型:

public void DataBindDropDowns()
{
    // ...
}

然后您可以通过以下方式从您的 ContentPages 调用它(假设您的母版页的类型称为SiteMaster

((SiteMaster)this.Page.Master).DataBindDropDowns();

编辑

...这不是上述母版页的子级

我想这意味着它不是ContentPage那个大师的,对吗?那么除了以下情况外,就不可能获得对 master 的引用:

  • master 的方法是静态的,在这个用例中是不可能的,因为你想在 master 上绑定控件
  • 您有一个页面的引用,该页面的母版属于该类型,但同样不可能,因为当前HTTP-Handler是另一个不使用该母版的页面

请注意,母版页实际上是 a 的子页ContentPage,并将与其合并。不可能获得对不存在的对象的引用!

来自MSDN

请注意,母版页成为内容页的一部分。实际上,母版页的行为方式与用户控件的行为方式非常相似——作为内容页面的子页面和该页面中的容器。

于 2012-05-21T10:25:58.830 回答
0

将其放入您的页面代码中(其中 MyMasterPage 是您的母版页对象):

MyMasterPage masterPage = (MyMasterPage) this.Master;

masterPage.MyBindDropDownListFunction(); // Replace with your public function name
于 2012-05-21T10:23:51.543 回答
0

您需要参考 MasterPage 属性,转换为您的母版页类型并调用您的方法。

((MyMasterPage)this.Master).MyBindingFunction();
于 2012-05-21T10:24:02.427 回答
0

为了更好的设计,使用 EventAggregator 模式。创建您的自定义事件并在母版页中处理它。

于 2012-05-21T11:48:26.507 回答
0

如果您经常使用它,您可以创建一个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; 
        }
    }
于 2012-05-21T10:37:04.487 回答
0

为了访问母版页的成员,页面内容上公开了一个 Master 属性。首先,您必须指定 @MasterType 指令:

<%@ Page  masterPageFile="~/MasterPage.master"%>
<%@ MasterType  virtualPath="~/MasterPage.master"%>

然后在母版页中创建一个公共功能,在您的内容页中,您只需调用

Master.MethodNameInMaster()
于 2012-05-21T10:38:01.250 回答