Использование вложенных главных страниц


Я очень новичок в этом деле. 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 2

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), почему? Что я должен написать для этого?