Использование вложенных главных страниц
Я очень новичок в этом деле. ASP.NET, помогите мне, пожалуйста, понять концепцию MasterPages больше.
У меня есть сайт.мастер с общими данными заголовка (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>
И я хочу использовать вторую главную страницу для проекта в подкаталог, который будет содержать SQL-запрос на Page_Load для ведения журнала (это не обязательно для всего сайта).
<%@ 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 ответов:
Я работал с вложенными главными страницами и столкнулся с чем-то подобным. Из того, что я вижу, где у вас есть" какой-то футер здесь " на сайте.Мастер-это то, в чем заключается проблема, и у меня были аналогичные проблемы с содержанием С-в теге contentplaceholder. если вы попробуете это вместо
<asp:ContentPlaceHolder ID="holderFooter" runat="server"/>Some footer here
Тогда вы сможете увидеть содержимое нижнего колонтитула.
Я не уверен, что буду использовать для этого главные страницы. Если это действительно просто собирается делать журнал, я бы реализовал IHttpModule, зарегистрировал его в web.config, а затем проверить, следует ли вести журнал на основе пути запроса. Я думаю о главных страницах как о содержании , а не о другой обработке, такой как ведение журнала.
Смотрите пошаговое руководство IHttpModule на MSDN для примера - в вашем обработчике BeginRequest вы, вероятно, проверите путь запроса и зарегистрируете его соответствующим образом, если он соответствие.
Извини, если я неправильно понял, что ты пытаешься сделать.
Вы должны оставить свой ContentPlaceHolder пустым, так как он будет заменен содержимым содержимого на вашей фактической странице...
Когда вы переместите текст "Some footer here" в свое содержимое, вы увидите свои строки текста:)
HTH
Эта ссылка дает простое объяснение на главных страницах, http://waxtadpole.wordpress.com/2009/01/16/master-page-content-not-visible-visual-studio-2008/
Вопрос в том, правильно ли вы используете дочерние главные страницы в этом случае - я бы сказал, что главные страницы должны помогать вам решать проблемы, связанные с построением согласованного макета, а не с тем, должно ли происходить ведение журнала.
Проблема заключается в том, когда текстовые элементы помещаются внутрь по умолчанию.aspx помещаются в их относительные заполнители контента, они записываются на заполнителях вашего сайта.главная страница, а не те из проекта.мастер (которые имеют те же имена).
Вы должны разрешить конфликт имен, назначив различные ContentPlaceHolderIDs заполнителям в проекте.master (это означает, что вам также придется изменить ссылки по умолчанию.aspx).
Это будет ваш проект.мастер файл:
<%@ 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>
И таким образом, ваш .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, зачем вам возиться с мастер-страницами? Если логирование не должно отображать какой-либо текст!?
Вы либо делаете, как скит предложил с обработчиком IHTTP.. Или ленивее было бы иметь класс, производный от webpage, и реализовать ведение журнала в этом классе и сделать ваши страницы, которые нуждаются в регистрации dervice от этого..
Пример:
public class LoggingPage : : System.Web.UI.Page { public override void OnLoad() { // Do logging } } partial class OneOfTheWebPages : LoggingPage { public void onLoad() { base.onLoad(); } }
Я, возможно, неправильно понимаю вашу проблему - но из кода, который вы опубликовали, нет ничего в нижнем колонтитуле.
На странице проекта тег
<asp:Content>
для держателя содержимогоholderFooter
ничего не содержит.
У меня есть следующее дерево наследования:
Site.master <-- Page1.aspx <-- Project.master <-- Page2.aspx
И я не знаю, почему Page2 отображает только содержимое самого себя, и это главная страница - проект. Но не отображает содержимое сайта (как это делает Page1), почему? Что я должен написать для этого?