【问题标题】:How to call a function from Masterpage into new form in c#如何在 C# 中将 Masterpage 中的函数调用为新表单
【发布时间】:2012-05-21 20:00:55
【问题描述】:

我有一个包含DropDownList 的母版页。我有一个在master中绑定列表的函数,它工作正常。

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

【问题讨论】:

  • 是子表单,即使用母版页??
  • See here:问题略有不同,但解决方案保持不变。或者here 是一个更精确的问题,same kind of answer
  • 另外需要注意的是,这个问题的当前答案都不是“安全的”——上面链接的两个答案都是。
  • 在下面查看我的答案。我将其转换为 C#。您应该可以将其用作指南。祝你好运!编码愉快!

标签: c# asp.net


【解决方案1】:

在此处查看article

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

【讨论】:

  • 这里的所有答案(也是我的),这不是 OP 所要求的。他想在一个不是当前页面的master的master中调用一个函数。
【解决方案2】:

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

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

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

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

编辑

...不是上述母版页的

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

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

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

来自MSDN

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 您的空引用检查不会使这个“安全”,如果主节点不是 MyMasterPage 类型,仍然会发生异常 - 这是一种常见的可能性。
      【解决方案5】:

      如果您经常使用它,您可以创建一个派生自System.Web.UI.PageBasePage,并将其用作表单的包页。

      您可以在此处添加母版页类型的属性,这将使您可以访问母版页的所有公共成员。

      如果您的母版页类是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; 
              }
          }
      

      【讨论】:

        【解决方案6】:

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

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

        然后在母版页中创建一个 Public 函数,然后在您的内容页中调用

        Master.MethodNameInMaster()
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-29
            • 2016-03-26
            • 2020-11-15
            • 2011-04-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多