2

私はASP.NETに非常に慣れていないので、MasterPagesの概念をもっと理解するのを手伝ってください。

共通のヘッダーデータ(css、metaなど)、センターフォーム(空白)、フッター(著作権情報、お問い合わせリンクなど)を備えたSite.masterがあります。

<%@ 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>

そして、プロジェクトの2番目のマスターページをサブディレクトリに使用したいと思います。これには、ロギング用のPage_LoadのSQLクエリが含まれます(サイト全体では必要ありません)。

<%@ 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>

しかし、問題があります。フッターが表示されません。

私の間違いはどこにありますか?ロギングのスーパークラスとして2番目のマスターページを使用する権利はありますか?

プロジェクトページは次のようになります。

<%@ 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>
4

8 に答える 8

11

私はネストされたマスターページで作業していて、似たようなものに出くわしました。Site.Masterのどこに「Somefooterhere」があるかを確認すると、問題が発生し、contentplaceholderタグ内にコンテンツを含めることで同様の問題が発生しました。代わりにこれを試してみてください

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

次に、フッターのコンテンツを表示できるはずです。

于 2009-01-27T09:43:02.720 に答える
4

これにマスターページを使用するかどうかはわかりません。本当にログを記録するだけなら、IHttpModule を実装して web.config に登録し、リクエストのパスに基づいてログを記録するかどうかを確認します。マスター ページは、ログなどの他の処理ではなく、コンテンツに関するものだと考えています。

例については、MSDN のIHttpModule ウォークスルーを参照してください。BeginRequestハンドラーで、おそらく要求パスを確認し、一致した場合は適切にログに記録します。

あなたがやろうとしていることを誤解した場合はお詫び申し上げます。

于 2009-01-27T10:03:04.037 に答える
2

実際のページのコンテンツのコンテンツに置き換えられるため、ContentPlaceHolder は空のままにしておく必要があります...

「Some footer here」テキストをコンテンツに移動すると、テキスト行が表示されます:)

HTH

于 2009-01-27T09:47:37.890 に答える
2

このリンクでは、マスター ページに関する簡単な説明が提供されてい ます。

問題は、この場合に子マスター ページを使用する権利があるかどうかです。マスター ページは、ログを記録するかどうかではなく、一貫したレイアウトの構築に関する問題の解決に役立つはずです。

于 2009-01-27T10:00:20.533 に答える
1

問題は、Default.aspx 内に配置されたテキスト要素が相対的なコンテンツ プレースホルダーに配置されると、Project.master (同じ名前を持つ) のプレースホルダーではなく、Site.master ページのプレースホルダーに書き込まれることです。

Project.master のプレースホルダーに異なる ContentPlaceHolderID を割り当てて、名前の競合を解決する必要があります (つまり、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>

したがって、グローバル Page.master の代わりにプロジェクト マスター ページを使用する .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>
于 2009-01-27T09:57:02.850 に答える
1

唯一の理由がログインを実装することである場合、なぜ masterpage を台無しにするのでしょうか? ロギングがテキストを表示することになっていない場合!?

Skeet が IHTTP ハンドラーで提案したようにするか、怠惰な人は、Web ページから派生したクラスを持ち、そのクラスにログ記録を実装し、そこからログ記録サービスが必要なページを作成します..

元:

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

partial class OneOfTheWebPages : LoggingPage
{
 public void onLoad()
{
base.onLoad();
}
}
于 2009-01-27T10:21:22.580 に答える
0

私はあなたの問題を誤解しているかもしれませんが、あなたが投稿したコードから、フッターには何もありません。

プロジェクトページでは<asp:Content>、コンテンツプレースホルダーのタグにholderFooterは何も含まれていません。

于 2009-01-24T14:06:06.897 に答える
0

私は次の継承ツリーを持っています:

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

そして、Page2 がそれ自体のコンテンツのみを表示し、それがマスター ページである Project である理由がわかりません。しかし、Site のコンテンツは表示されません (Page1 のように) なぜですか? それをするために何を書かなければなりませんか?

于 2009-01-24T23:33:05.193 に答える