【问题标题】:How to determine which Child Page is being displayed from Master Page?如何确定从母版页显示哪个子页?
【发布时间】:2008-11-06 15:15:21
【问题描述】:

我正在母版页上编写代码,我需要知道正在显示哪个子(内容)页面。我怎样才能以编程方式做到这一点?

【问题讨论】:

    标签: c# asp.net master-pages


    【解决方案1】:

    我用这个:

    string pageName = this.ContentPlaceHolder1.Page.GetType().FullName;
    

    它以这种格式“ASP.default_aspx”重新调整类名,但我发现对于大多数用途来说这很容易解析。

    希望有帮助!

    【讨论】:

    • 您可以使用string pageName = this.ContentPlaceHolder1.Page.GetType().BaseType.Name; 这将返回子页面的基类类型。在大多数情况下,它会给出不带“aspx”标签的页面地址。例如“默认”。
    【解决方案2】:

    最好让ContentPage 通知MasterPage。这就是为什么ContentPage 具有Master 属性而MasterPage 没有Child 属性的原因。 最好的做法是在MasterPage 上定义一个属性或方法,并通过ContentPageMaster 属性使用它。

    如果您使用此技术,最好明确指定 MasterPage 的类名。这使得在 ContentPage 中使用 MasterPage。

    例子:

    //Page_Load
    MyMaster m = (MyMaster)this.Master;
    
    m.TellMasterWhoIAm(this);
    

    希望这会有所帮助。

    【讨论】:

    • 我喜欢这个。有时,母版页确实需要用户提供一些信息。这是一种干净的方式。
    • 这是一个很好的解决问题的方法。原始海报询问如何做并不是一个真正的好做法,您提供了一个解决方案,指导 OP 遵循更好的做法。谢谢@norbertB!
    【解决方案3】:

    这听起来是个坏主意。大师的想法是它不应该关心那里有什么页面,因为这是每个页面的所有通用代码。

    【讨论】:

    • +1 没错。这与母版页的含义非常不符。
    • 这是一个很好的一般规则,但是像面包屑这样的东西呢?您希望在每个页面上都使用它,但您需要知道加载了哪个特定页面以确定碎屑。为此,我通常在母版页上公开一个公共函数来设置最终的碎屑,这由页面调用。其他面包屑由站点地图确定。
    • 如果您的母版页包含在某些情况下重定向到“安全”页面的逻辑,除非正在显示安全页面,您的建议是什么?
    • @norbertB 为 IMO 提供了一个很好的解决方案,说明如何在不需要母版页知道正在显示的页面的情况下实现预期结果。
    • 那么,如果我只想在我的目标网页上使用图像滑块,而在其他任何地方都没有呢? (我的 ContentPlaceHolder 被包裹在一个具有通用样式的 div 中,图像滑块不应该有)
    【解决方案4】:

    我有理由检查母版页中的子页。

    我的母版页上有所有菜单选项,如果未设置某些系统设置,则需要禁用它们。

    如果不是,则会显示一条消息并禁用按钮。由于设置页面是此母版页的内容页面,因此我不希望该消息一直显示在所有设置页面上。

    这段代码对我有用:

                    //Only show the message if on the dashboard (first page after login)
                    if (this.ContentPlaceHolder1.Page is Dashboard)
                    {
                        //Show modal message box
                        mmb.Show("Warning Message");
                    }
    

    【讨论】:

    • 我正在使用 VB,这对我有用:如果 ContentPlaceHolder1.Page.GetType().BaseType Is GetType(Dashboard)
    【解决方案5】:

    使用下面的代码。

    Page.ToString().Replace("ASP.","").Replace("_",".")
    

    【讨论】:

    • 非常感谢。它的工作。这意味着,我们可以从 masterpage 访问任何页面...
    • 这是我的解决方案,我需要内容页面的名称来评估应该或不应该显示标签的功能
    【解决方案6】:

    【讨论】:

    • 这在我的情况下完成了这项工作,因为我要求的是精确的文件名,而不是对象。
    【解决方案7】:

    这是我对问题的解决方案(此代码进入母版页后面的代码):

    if (Page.TemplateControl.AppRelativeVirtualPath == "~/YourPageName.aspx")
    {
       // your code here
    }
    

    或者更复杂一点,但可读性较差:

    if (Page.TemplateControl.AppRelativeVirtualPath.Equals("~/YourPageName.aspx", StringComparison.OrdinalIgnoreCase))
    {
       // your code here
    }
    

    【讨论】:

      【解决方案8】:
      Request.CurrentExecutionFilePath;
      

      Request.AppRelativeCurrentExecutionFilePath;
      

      【讨论】:

        【解决方案9】:

        我在我的一个项目中做了类似的事情,根据正在加载的页面动态附加 css 文件。我只是从请求中获取文件的名称:

        this.Request.Url.AbsolutePath
        

        然后从那里提取文件名。不过,我不确定如果您正在重写 URL,这是否会起作用。

        【讨论】:

          【解决方案10】:

          您可以通过获取最后一个段或请求来做到这一点,我将成为表单名称

          string pageName = this.Request.Url.Segments.Last(); 
          
          if (pageName.Contains("EmployeeTermination.aspx"))
          {
          
          }
          

          【讨论】:

            【解决方案11】:

            你可以试试这个:

            <%: this.ContentPlaceHolder1.Page.GetType().Name.Split('_')[0].ToUpper() %>

            将该代码放在Site.Mastertitle 标记内

            【讨论】:

              【解决方案12】:
              string s =   Page.ToString().Replace("ASP.directory_name_","").Replace("_aspx",".aspx").Replace("_","-");
                      if (s == "default.aspx")
                            { /* do something */ }
              

              【讨论】:

                【解决方案13】:

                我正在使用这么多答案

                <%if(this.MainContent.Page.Title != "mypagetitle") { %>
                <%}%>
                

                这使得排除任何单个页面变得容易,并且由于您比较一个字符串,您甚至可以为 exclude_pagetitle 之类的页面添加前缀并比较标题的子字符串。我通常使用它来从某些我不想加载的功能中排除登录页面,例如会话超时和实时聊天。

                【讨论】:

                  【解决方案14】:

                  下面的代码就像一个迷人的..试试它

                  string PName = Request.UrlReferrer.Segments[Request.UrlReferrer.Segments.Length - 1];
                  

                  【讨论】:

                    【解决方案15】:

                    您应该可以从母版页代码中获得 Page.Request.Url.PathAndQuery 或 Url Uri 对象的其他属性之一。

                    【讨论】:

                      【解决方案16】:

                      您可以在代码隐藏中检查页面类型:

                      // Assuming MyPage1, MyPage2, and MyPage3 are the class names in your aspx.cs files:
                      
                      if (this.Page is MyPage1)
                      {
                        // do MyPage1 specific stuff
                      }
                      else if (this.Page is MyPage2)
                      {
                        // do MyPage2 specific stuff
                      }
                      else if (this.Page is MyPage3)
                      {
                        // do MyPage3 specific stuff
                      }
                      

                      【讨论】:

                      • 这也是我所期望的,但这不起作用。 ASP.NET 似乎破坏了类声明(很烦人!),所以虽然看起来你在声明 MyPage1,但实际上并非如此。你得到类似ASP.MyPage1_aspx的东西,你不能在编译时引用这个类型。
                      猜你喜欢
                      • 1970-01-01
                      • 2011-02-07
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-11-24
                      相关资源
                      最近更新 更多