如何在 c# 中将函数从母版页调用到新窗体中

本文关键字:新窗体 窗体 调用 函数 母版页 | 更新日期: 2023-09-27 18:34:53

我有一个包含DropDownList的母版页。我有一个用于在主控文件中绑定列表的函数,它工作正常。

我的问题是:我将如何从窗体调用该母版页函数,该窗体不是上述母版页的子项

如何在 c# 中将函数从母版页调用到新窗体中

请参阅此处的文章。

这是来自 ASP.NET 2.0 中的新编译模型的一些好处。假设您将自定义属性添加到母版页代码隐藏文件,如下所示:

partial class otcMaster : System.Web.UI.MasterPage
{
public string FooterText {
    get { return Footer.Text; }
    set { Footer.Text = value; }
}
 }

可以使用继承的 Master 属性访问 Web 窗体的母版页,该属性返回母版页引用。但是,要访问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()
{
    // ...
}

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

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

编辑

。不是上述母版页的子级

我想这意味着它不是那个师父的ContentPage,对吗?然后,无法获取对主节点的引用,除非

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

请注意,母版页实际上是ContentPage的子级,并将与之合并。无法获取对不存在的对象的引用!

从 MSDN:

请注意,母版页将成为内容页的一部分。在 效果,母版页的行为方式与用户控件的行为方式大致相同 — 作为内容页面的子级和该页面中的容器。

您需要引用母版页属性,强制转换为母版页类型并调用方法。

((MyMasterPage)this.Master).MyBindingFunction();

把它放在你的页面代码中(其中MyMasterPage是你的母版页对象(:

MyMasterPage masterPage = (MyMasterPage) this.Master;
masterPage.MyBindDropDownListFunction(); // Replace with your public function name

如果您非常频繁地制作它,您可以创建一个派生自System.Web.UI.PageBasePage,并将其用作表单的bage页面。

在这里,您可以添加母版页类型的属性,该属性将允许您访问母版页的所有公共成员。

如果你的母版页类是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(...);

您还可以在基本页面中添加任何其他所需的功能。

注意:如果要确保页面中的属性不为 null,可以添加检查以查看页面是否具有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; 
        }
    }

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

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

然后在母版页中创建一个公共函数,并在内容页中调用

Master.MethodNameInMaster()

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