Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top