Использование вложенных мастер-страниц - PullRequest
2 голосов
/ 24 января 2009

Я очень новичок в 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>

и я хочу использовать вторую главную страницу для проекта в подкаталоге, который будет содержать 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 ]

11 голосов
/ 27 января 2009

Я работал с вложенными мастер-страницами и столкнулся с чем-то похожим. Из того, что я вижу, где у вас есть "Некоторые нижние колонтитулы" на Сайте. Мастер находится там, где проблема, и у меня были аналогичные проблемы с наличием контента внутри тега contentplaceholder. если вы попробуете это вместо

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

Тогда вы сможете увидеть содержимое нижнего колонтитула.

4 голосов
/ 27 января 2009

Я не уверен, что использовал бы главные страницы для этого. Если это действительно просто сделать запись в журнал, я бы реализовал IHttpModule, зарегистрировал его в web.config, а затем проверил, нужно ли вести журнал на основе пути запроса. Я думаю о главных страницах как о контенте , а не о другой обработке, такой как ведение журнала.

См. Пример IHttpModule на MSDN для примера - в вашем обработчике BeginRequest вы, вероятно, проверите путь запроса и зарегистрируете соответствующим образом, если он совпадает.

Извиняюсь, если я неправильно понял, что вы пытаетесь сделать.

2 голосов
/ 27 января 2009

Эта ссылка дает простое объяснение на главных страницах, http://waxtadpole.wordpress.com/2009/01/16/master-page-content-not-visible-visual-studio-2008/

Вопрос в том, правильно ли вы использовать дочерние мастер-страницы в этом случае - я бы сказал, что мастер-страницы должны помогать вам решать проблемы, связанные с построением согласованного макета, а не с тем, должна ли регистрироваться запись.

2 голосов
/ 27 января 2009

Вы должны оставить свой ContentPlaceHolder пустым, поскольку он заменяется содержимым Контента на вашей фактической странице ...

Когда вы перенесете текст «Некоторый нижний колонтитул» в свой Контент, вы увидите ваши строки текста:)

НТН

1 голос
/ 27 января 2009

Если единственная причина заключается в реализации входа в систему, зачем вам возиться с мастер-страницами? Если при ведении журнала предполагается отображение какого-либо текста!?

Вы либо делаете так, как предлагал Skeet, с обработчиком IHTTP. Или более ленивым было бы иметь класс, производный от веб-страницы, и осуществлять регистрацию в этом классе и делать ваши страницы нуждающимися в этом.

например:

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

partial class OneOfTheWebPages : LoggingPage
{
 public void onLoad()
{
base.onLoad();
}
}
1 голос
/ 27 января 2009

Проблема в том, что когда текстовые элементы, помещенные в 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>
0 голосов
/ 25 января 2009

У меня есть следующее дерево наследования:

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

И я не знаю, почему Page2 отображает только сам контент и его главную страницу - Project. Но не отображает содержимое сайта (как показывает страница 1) Почему? Что я должен написать для этого?

0 голосов
/ 24 января 2009

Возможно, я неправильно понимаю вашу проблему - но из кода, который вы разместили, нет ничего в нижнем колонтитуле.

На странице вашего проекта тег <asp:Content> для заполнителя содержимого holderFooter не содержит ничего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...