Использование вложенных главных страниц
-
19-08-2019 - |
Вопрос
Я новичок в ASP.NET, помогите мне лучше понять концепцию MasterPages.
У меня есть Site.master с общими данными заголовка (css, мета и т. д.), центральной формой (пустой) и нижним колонтитулом (информация об авторских правах, ссылка «Свяжитесь с нами» и т. д.).
<%@ 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>
Решение
Я работал с вложенными мастер-страницами и столкнулся с чем-то похожим. Из того, что я вижу, где у вас есть & "Некоторый нижний колонтитул здесь &" в Site.Master, где проблема заключается, и у меня были аналогичные проблемы с содержанием внутри тега contentplaceholder. если вы попробуете это вместо этого
<asp:ContentPlaceHolder ID="holderFooter" runat="server"/>Some footer here
Тогда вы сможете увидеть содержимое нижнего колонтитула.
Другие советы
Я не уверен, что использовал бы главные страницы для этого. Если это действительно просто сделать запись в журнал, я бы реализовал IHttpModule, зарегистрировал его в web.config, а затем проверил, нужно ли вести журнал на основе пути запроса. Я думаю о главных страницах как о контенте , а не о другой обработке, такой как ведение журнала.
См. пошаговое руководство IHttpModule в MSDN для примера - в ваш обработчик BeginRequest, вы, вероятно, проверили бы путь запроса и соответствующим образом регистрировали бы, если он совпадает.
Извиняюсь, если я неправильно понял, что вы пытаетесь сделать.
Вам следует оставить ContentPlaceHolder пустым, поскольку он будет заменен содержимым Контента на вашей фактической странице...
Когда вы переместите текст «Некоторый нижний колонтитул здесь» в свой контент, вы увидите свои строки текста :)
ХТХ
Эта ссылка дает простое объяснение на главных страницах, http: // waxtadpole .wordpress.com / 2009/01/16 / мастер-страниц контента не-видимой визуально-студия-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>
И поэтому ваши страницы .aspx, которые используют главную страницу проекта вместо глобального Page.master, должны быть изменены на:
<%@ 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, зачем возиться с мастер-страницами? Если при ведении журнала предполагается отображение какого-либо текста!?
Вы либо делаете, как предлагал Skeet, с обработчиком IHTTP. Или более ленивым было бы иметь класс, производный от веб-страницы, и осуществлять регистрацию в этом классе и делать ваши страницы нуждающимися в этом.
ex:
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 отображает только сам контент и его главную страницу - Project. Но не отображает содержимое сайта (как показывает страница 1) Почему? Что я должен написать для этого?