[英]Using nested Master Pages
我是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>
我一直在使用嵌套的母版页并运行类似的东西。 从我看到你在Site.Master中有“一些页脚”的地方,问题所在,我在内容持有人标签中有内容。 如果你试试这个
<asp:ContentPlaceHolder ID="holderFooter" runat="server"/>Some footer here
然后你应该能够看到页脚内容。
我不确定我是否会使用母版页。 如果它真的只是要进行日志记录,我将实现IHttpModule,在web.config中注册它,然后检查是否根据请求的路径进行日志记录。 我认为母版页是关于内容而不是其他处理,例如日志记录。
有关示例,请参阅MSDN上的IHttpModule演练 - 在BeginRequest处理程序中,您可能会检查请求路径并在匹配时正确记录。
如果我误解了你想要做的事,我会道歉。
您应该将ContentPlaceHolder留空,因为它会被您实际页面中内容的内容所取代...
当您将“Some footer here”文本移动到您的内容时,您将看到您的文本行:)
HTH
此链接在母版页上提供了简单的说明, http://waxtadpole.wordpress.com/2009/01/16/master-page-content-not-visible-visual-studio-2008/
问题是你在这个例子中使用子母版页是正确的 - 我会说母版页应该帮助你解决建立一致布局的问题,而不是是否应该进行日志记录。
问题是,当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>
如果唯一的原因是实现loggin为什么你会搞乱masterpages呢? 如果日志记录应该显示任何文本!?
你可以像Skeet提出的那样使用IHTTP处理程序。或者更懒的人会有一个派生自网页的类,并在该类中实现日志记录,并使你的页面需要从那里进行日志记录。
例如:
public class LoggingPage : : System.Web.UI.Page
{
public override void OnLoad()
{
// Do logging
}
}
partial class OneOfTheWebPages : LoggingPage
{
public void onLoad()
{
base.onLoad();
}
}
我可能会误解你的问题-但是从您发布的代码,没有在页脚任何东西。
在Project页面中, holderFooter
内容占位符的<asp:Content>
标记中没有任何内容。
我有下一个继承树:
Site.master <-- Page1.aspx
<-- Project.master <-- Page2.aspx
我不知道为什么Page2只显示自己的内容和它的主页 - 项目。 但不显示网站的内容(如Page1所做)为什么? 我有什么要写的呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.