10

シナリオ

asp.netマスターページを使用しているアプリケーションがあり、ページの上部と下部でいくつかのコンテンツを繰り返したいと思っています。現在、私は次のようなものを使用しています:

マスターページ
<html>
  <body>
    <asp:ContentPlaceHolder ID="Foo" runat="server">
    </asp:ContentPlaceHolder>
    <!-- page content -->
    <asp:ContentPlaceHolder ID="Bar" runat="server">
    </asp:ContentPlaceHolder>
  </body>
</html>
コンテンツページ
<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
  <!-- content -->
</asp:Content>
<asp:Content ID="Bottom" ContentPlaceHolderID="Bar" runat="server">
  <!-- content repeated -->
</asp:Content>

メンテナンス

ご存知のように、コードで物事を繰り返すことは通常良くありません。メンテナンスの問題が発生します。以下は私がやりたいことですが、id属性が繰り返されているため明らかに機能しません。

マスターページ
<html>
  <body>
    <asp:ContentPlaceHolder ID="Foo" runat="server">
    </asp:ContentPlaceHolder>
    <!-- page content -->
    <asp:ContentPlaceHolder ID="Foo" runat="server">
    </asp:ContentPlaceHolder>
  </body>
</html>
コンテンツページ
<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
  <!-- content (no repetition) -->
</asp:Content>

可能?

asp.net Webフォームを使用してこれを行う方法はありますか?ソリューションは必ずしも上記のコンテンツに似ている必要はなく、同じように機能する必要があります。

ノート

VisualStudio2008でasp.net3.0を使用しています

4

5 に答える 5

6

ねえ、誰かがまだこれに対する解決策を必要としているなら、私がやったことは次のとおりです: マスターページのコードファイルに入れます

protected override void RenderChildren(HtmlTextWriter writer)
{
    Control mainPlaceHolder = FindControl("MainContentPlaceHolder");
    Control doublePlaceHolder = FindControl("ContentDoublePlaceHolder");

    StringBuilder sb = new StringBuilder();

    using (StringWriter sw = new StringWriter(sb))
    using (HtmlTextWriter tw = new HtmlTextWriter(sw))
    {
        mainPlaceHolder.RenderControl(tw);
    }

    LiteralControl lc = new LiteralControl(sb.ToString());
    doublePlaceHolder.Controls.Add(lc);

    base.RenderChildren(writer);
}

ここでのパフォーマンスの問題についてはわかりませんが、確かに機能します。

于 2009-10-03T16:05:26.223 に答える
3

他の人が言ったように、コンテンツ自体に応じて、そこにあるコンテンツの種類に応じて使用できるショートカットがあります.

ただし、「コンテンツ」が asp.net コードを完全に機能させる必要があると仮定すると、コンテンツ自体を含む ContentPage ごとに UserControl を提案し、1 行のコードを複製するだけで済みます。

マスターページ

<html>
    <body>
        <asp:ContentPlaceHolder ID="Foo" runat="server">
        </asp:ContentPlaceHolder>
        <!-- page content -->
        <asp:ContentPlaceHolder ID="Bar" runat="server">
        </asp:ContentPlaceHolder>
    </body>
</html>

コンテンツページ

<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
    <uc1:Page1Control id="page1Control1" runat="server" />
</asp:Content>
<asp:Content ID="Bottom" ContentPlaceHolderID="Bar" runat="server">
    <uc1:Page1Control id="page1Control2" runat="server" />
</asp:Content>
于 2009-04-17T13:23:55.100 に答える
1

同じもののCOMMONユーザーコントロールを作成し、それをマスターページの上部と下部に追加できます。コントロールが上部または下部のどちらにロードされたかを説明するプロパティを作成できます。

于 2009-04-17T13:15:15.213 に答える
0

コンテンツによっては、コードでこれを実行できる場合があります。HTMLだけの場合は、変数に入れて他の変数に割り当てます。コントロールがある場合は、コントロールコレクションをループして、複製コントロールを作成し、それを他の領域に配置できます。いずれの場合も、2番目の場所はdivが支払うべきコンテンツプレースホルダーではありません。

于 2009-04-17T13:15:30.643 に答える