使用嵌套的母版页

时间:2009-01-24 13:56:41

标签: c# asp.net inheritance master-pages nested

我是ASP.NET的新手,请帮助我更多地了解MasterPages概念。

我的Site.master有常见的标题数据(css,meta等),中心表单(空白)和页脚(版权信息,联系我们链接等)。

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="_SiteMaster" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="tagHead" runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" href="styles.css" type="text/css" />
</head>
<body>
    <form id="frmMaster" runat="server">
    <div>
        <asp:ContentPlaceHolder ID="holderForm" runat="server"></asp:ContentPlaceHolder>
        <asp:ContentPlaceHolder ID="holderFooter" runat="server">Some footer here</asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

我希望将项目的第二个母版页用于子目录,该目录将包含用于记录的Page_Load上的SQL查询(整个站点不需要)。

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Project.master.cs" Inherits="_ProjectMaster" MasterPageFile="~/Site.master" %>
<asp:Content ContentPlaceHolderID="holderForm" runat="server">
    <asp:ContentPlaceHolder ID="holderForm" runat="server" EnableViewState="true"></asp:ContentPlaceHolder>
</asp:Content>
<asp:Content ContentPlaceHolderID="holderFooter" runat="server">
    <asp:ContentPlaceHolder ID="holderFooter" runat="server" EnableViewState="true"></asp:ContentPlaceHolder>
</asp:Content>

但是我有一个问题:没有显示页脚。

我的错误在哪里?我是否正确使用第二个母版页作为记录的超级类?

项目页面如下所示:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" MasterPageFile="~/Project.master" %>
<asp:Content ContentPlaceHolderID="holderForm" runat="server">
    <p>Hello World!</p>
</asp:Content>
<asp:Content ContentPlaceHolderID="holderFooter" runat="Server">
    Some footer content
</asp:Content>

8 个答案:

答案 0 :(得分:11)

我一直在使用嵌套的母版页,并且已经运行了类似的东西。从我看到你在Site.Master中有“一些页脚”的地方,问题所在,我在内容持有人标签中有内容。如果你试试这个

<asp:ContentPlaceHolder ID="holderFooter" runat="server"/>Some footer here

然后你应该能够看到页脚内容。

答案 1 :(得分:4)

我不确定我是否会使用母版页。如果它真的只是要进行日志记录,我将实现IHttpModule,在web.config中注册它,然后检查是否根据请求的路径进行日志记录。我认为母版页是关于内容而不是其他处理,例如日志记录。

请参阅MSDN上的IHttpModule walkthrough以获取示例 - 在BeginRequest处理程序中,您可能会检查请求路径并在匹配时正确记录。

如果我误解了你想要做的事情,那就道歉了。

答案 2 :(得分:2)

您应该将ContentPlaceHolder留空,因为它会被您实际网页中内容的内容所取代...

当您将“此处的一些页脚”文字移动到您的内容时,您将看到您的文字行:)

HTH

答案 3 :(得分:2)

此链接提供有关母版页的简单说明, http://waxtadpole.wordpress.com/2009/01/16/master-page-content-not-visible-visual-studio-2008/

问题是你在这个例子中使用子母版页是正确的 - 我会说母版页应该帮助你解决建立一致布局的问题,而不是是否应该进行日志记录。

答案 4 :(得分:1)

问题是,当Default.aspx中的文本元素放在它们的相对内容占位符中时,它们会写在Site.master页面的占位符上,而不是Project.master(具有相同名称)的占位符上。

您应该通过将不同的ContentPlaceHolderID分配给Project.master中的占位符来解决命名冲突(这意味着您还必须更改Default.aspx中的引用)。

这将是您的Project.master文件:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Project.master.cs" Inherits="_ProjectMaster" MasterPageFile="~/Site.master" %>
<asp:Content ContentPlaceHolderID="holderForm" runat="server">
    <!-- whatever... -->
    <asp:ContentPlaceHolder ID="holderFormInternal" runat="server" EnableViewState="true"></asp:ContentPlaceHolder>
    <!-- ... -->
</asp:Content>
<asp:Content ContentPlaceHolderID="holderFooter" runat="server">
    <asp:ContentPlaceHolder ID="holderFooterInternal" runat="server" EnableViewState="true"></asp:ContentPlaceHolder>
</asp:Content>

因此,使用Project母版页而不是全局Page.master的.aspx页面必须更改为:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" MasterPageFile="~/Project.master" %>
<asp:Content ContentPlaceHolderID="holderFormInternal" runat="server">
    <p>Hello World!</p>
</asp:Content>
<asp:Content ContentPlaceHolderID="holderFooterInternal" runat="Server">
</asp:Content>

答案 5 :(得分:1)

如果唯一的原因是实施loggin,你为什么要乱用主页呢? 如果日志记录应该显示任何文本!?

你要么像Skeet提出的那样使用IHTTP处理程序..或者懒得一个人会有一个派生自网页的类,并在该类中实现日志记录,并使你的页面需要从那里进行日志记录...

前:

public class LoggingPage : : System.Web.UI.Page
{
  public override void OnLoad()
{
// Do logging
}
}

partial class OneOfTheWebPages : LoggingPage
{
 public void onLoad()
{
base.onLoad();
}
}

答案 6 :(得分:0)

我可能误解了您的问题 - 但是根据您发布的代码,页脚中没有任何

在您的项目页面中,<asp:Content>内容占位符的holderFooter标记中没有任何内容。

答案 7 :(得分:0)

我有下一个继承树:

Site.master <-- Page1.aspx
<-- Project.master <-- Page2.aspx

我不知道为什么Page2只显示自己的内容和它的主页 - 项目。但不显示网站的内容(如Page1所做)为什么?我有什么要写的呢?