2

我对 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>
4

8 回答 8

11

我一直在使用嵌套母版页,并且遇到过类似的情况。从我看到的情况来看,您在 Site.Master 中的“此处有一些页脚”是问题所在,我在 contentplaceholder 标记中包含内容时遇到了类似的问题。如果你试试这个

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

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

于 2009-01-27T09:43:02.720 回答
4

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

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

如果我误解了你想要做的事情,我深表歉意。

于 2009-01-27T10:03:04.037 回答
2

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

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

高温高压

于 2009-01-27T09:47:37.890 回答
2

此链接对母版页进行了简单说明, http://waxtadpole.wordpress.com/2009/01/16/master-page-content-not-visible-visual-studio-2008/

问题是您在这种情况下使用子母版页是否正确 - 我想说母版页应该帮助您解决围绕构建一致布局的问题,而不是是否应该发生日志记录。

于 2009-01-27T10:00:20.533 回答
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>

因此,使用项目母版页而不是全局 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>
于 2009-01-27T09:57:02.850 回答
1

如果唯一的原因是实现登录,你为什么要搞乱母版页?如果日志记录不应该显示任何文本!?

您要么按照 Skeet 建议的 IHTTP 处理程序进行操作。或者更懒惰的做法是拥有一个派生自网页的类并在该类中实现日志记录,并使您的页面需要从该类进行日志记录服务..

前任:

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

partial class OneOfTheWebPages : LoggingPage
{
 public void onLoad()
{
base.onLoad();
}
}
于 2009-01-27T10:21:22.580 回答
0

我可能误解了您的问题 - 但从您发布的代码来看,页脚中没有任何内容

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

于 2009-01-24T14:06:06.897 回答
0

我有下一个继承树:

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

而且我不知道为什么 Page2 只显示自己的内容,它是母版页 - 项目。但是不显示 Site 的内容(如 Page1 那样) 为什么?我有什么要写的呢?

于 2009-01-24T23:33:05.193 回答