如何确定从主页面显示哪个子页面?(涉及IT技术)

26

我正在编写主页的代码,需要知道当前显示的子页面是哪个。如何通过程序实现这一功能?

16个回答

32

我使用这个:

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

它返回这种格式的类名 "ASP.default_aspx",但我发现大多数情况下很容易解析。

希望能帮到你!


6
你可以使用 string pageName = this.ContentPlaceHolder1.Page.GetType().BaseType.Name; 这个语句来获取子页面的基类类型。在大多数情况下,它会返回不带 "aspx" 标签的页面地址。例如,“Default”。 - Tarık Özgün Güner

24

最好让ContentPage通知MasterPage。这就是为什么ContentPage有一个Master属性,而MasterPage没有Child属性的原因。

在这种情况下,最佳实践是在MasterPage上定义一个属性或方法,并通过ContentPageMaster属性使用它。

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

例如:

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

m.TellMasterWhoIAm(this);
希望这能有所帮助。

我喜欢这个。有时候母版页面确实需要一些来自用户的信息。这是一种干净利落的方式来实现它。 - Clinton Pierce
1
这是一个很好的解决方案。原帖提问的做法并不是一个好的实践方法,而你给出了一个解决方案,指导了 OP 遵循更好的实践方法。感谢 @norbertB! - Adam Porad
这是我和其他健忘的人的提醒。为了使Norbert的答案起作用,请确保将@ MasterType指令添加到子Web表单的**.aspx**文件中,以便C#代码可以访问主控件的属性和方法,例如Master.SomeProperty = "SomeValue"; - Theophilus

9

我有一个理由要检查主页面中的子页面。

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

如果没有设置,则会显示一条消息并禁用按钮。由于设置页面是从此主页面获得的内容页面,因此我不希望在所有设置页面上持续显示该消息。

这段代码对我很有用:

                //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是GetType(Dashboard)。 - Kai Hartmann

9
这听起来不是一个好主意。毕竟,主程序的理念是不应该关心页面的存在,因为这些都是每个页面共有的代码。

3
+1。这非常违背主页的初衷。 - NotMe
10
这是一条好的通用规则,但对于像面包屑导航这样的东西呢?您希望在每个页面上都有它,但需要知道加载的具体页面以确定导航。为此,我通常会在母版页上公开一个设置最终导航的公共函数,并由页面调用。其他导航则由站点地图确定。 - spilliton
1
如果您的主页面包含了重定向到“安全”页面的逻辑,但某些情况下除外(即显示安全页面),您会有什么建议? - El Ronnoco
1
那么,如果我只想在我的登陆页面上使用图像轮播,而其他地方不使用呢?(并且我的ContentPlaceHolder被包装在一个具有通用样式的div中,而图像轮播不应该有这个样式) - Krummelz
这是一个非常老的答案,现在有新的元标签来处理所有社交媒体内容,如果需要,在主页面上设置默认的元标签和每个其他页面上的特定页面标签是一个好主意。 - Pierre
显示剩余2条评论

7
使用以下代码。
Page.ToString().Replace("ASP.","").Replace("_",".")

非常感谢。它奏效了。这意味着我们可以从母版页访问任何页面... - Mahmut EFE
这是我的解决方案,我需要内容页面的名称来评估一个函数,该函数应该或不应该显示一个标签。 - Bachask8

4

在我的情况下,这个做到了它的工作,因为我要求的是精确的文件名,而不是对象。 - gkakas

3

以下是我对这个问题的解决方案(这段代码放在主页面的代码后面):

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

或者更加复杂一些,但可读性稍差:
if (Page.TemplateControl.AppRelativeVirtualPath.Equals("~/YourPageName.aspx", StringComparison.OrdinalIgnoreCase))
{
   // your code here
}

1
Request.CurrentExecutionFilePath;

或者

Request.AppRelativeCurrentExecutionFilePath;

0
string s =   Page.ToString().Replace("ASP.directory_name_","").Replace("_aspx",".aspx").Replace("_","-");
        if (s == "default.aspx")
              { /* do something */ }

0

以下代码运行得非常好,试一试吧

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接