コンテンツページからレイアウトページのHeadセクションにコンテンツを設定したい (セクションの利用) - ASP.NET Core

コンテンツページからレイアウトページのHeadセクションにコンテンツを設定するコードを紹介します。

概要

こちらの記事では、コンテンツページからViewBagやViewDataを利用してページのタイトルを設定するコードを紹介しました。
タグ内に埋め込む文字列の場合は紹介した方法で対応できますが、タグを含むHTMLやJavaScriptのコードをレイアウトページに反映できません。
この記事では、セクションの機能を利用して、レイアウトページのHead内にタグを含めたHTMLコンテンツを出力する手順を紹介します。

方針

コンテンツページにセクションを定義し、レイアウトページの埋め込みたい位置に、RenderSection() メソッドを記述します。

書式

セクションの定義

@section [セクション名]{
 <!-- セクションのコンテンツを記述 -->
}

セクションの出力

@RenderSection("[セクション名]");

プログラム例

ASP.NET アプリケーションを作成します。

コード

Pages/_Layout.cshtml
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link rel="stylesheet" href="Layout.css" />
    <title>@ViewBag.Title</title>
    @RenderSection("MyScript")
</head>
<body>

    <div class="Header">ヘッダ</div>
    <div>
        @RenderBody()
    </div>
    <div class="Footer">フッタ</div>

</body>
</html>
wwwroot/Layout.css
.Header {
  background-color: #ceeaff;
  border: 1px solid #318dff;
}

.Footer {
  background-color: #dddddd;
  border: 1px solid #808080;
}
Pages/Content1.cshtml
@page
@{
      ViewData["Title"] = "Content1";
    Layout = "~/Pages/_Layout.cshtml";
}

@section MyScript{
 <script type="text/javascript">
   alert("Test");
 </script>
}

<h1>TestPage - Content1</h1>
<p>コンテンツ1のテストページです。</p>
Pages/Content2.cshtml
@page
@{
    ViewData["Title"] = "Content2";
    Layout = "~/Pages/_Layout.cshtml";
}
@section MyScript{
}


<h1>TestPage - Content2</h1>
<p>コンテンツ2のテストページです。</p>
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var app = builder.Build();

app.UseStaticFiles();
app.UseRouting();
app.MapRazorPages();

app.Run();

解説

@RenderSection() メソッドによりコンテンツページで定義されたコンテンツを出力します。第一引数にレンダリングするセクション名を与えます。
<head>
    <!-- 中略 -->
    @RenderSection("MyScript")
</head>

Content1ページのMyScriptセクション部分は以下のコードです。JavaScriptの alert() 関数を実行するスクリプトを出力します。
@section MyScript{
 <script type="text/javascript">
   alert("Test");
 </script>
}

Content2ページのMySectio部分は以下のコードです。空になっており、何も出力しない設定となっています。
@section MyScript{
}

実行結果

プロジェクトを実行し、(アプリケーションURL)/Content1 ページにアクセスします。
URLを開くと下図のアラートダイアログが表示されます。


アラートダイアログの[OK]ボタンをクリックするとページが表示されます。


ページのコードは以下の通りです。
alert("Test"); のコードがheadタグ内に出力されていることが確認できます。
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link rel="stylesheet" href="Layout.css" />
    <title>Content1</title>
    
 <script type="text/javascript">
   alert("Test");
 </script>

</head>
<body>

    <div class="Header">ヘッダ</div>
    <div>
        

<h1>TestPage - Content1</h1>
<p>コンテンツ1のテストページです。</p>

    </div>
    <div class="Footer">フッタ</div>


<!-- Visual Studio Browser Link -->
<script type="text/javascript" src="/_vs/browserLink" async="async" id="__browserLink_initializationData"
 data-requestId="c6476c316bff4f74977147cac9bd8256"data-requestMappingFromServer="false"
 data-connectUrl="http://localhost:53487/9c73d7ac66b8438ebf7e088d46c76441/browserLink"></script>
<!-- End Browser Link -->

<script src="/_framework/aspnetcore-browser-refresh.js"></script></body>
</html>

続いて、(アプリケーションURL)/Content2 ページにアクセスします。
こちらのURLの場合はアラートダイアログは表示されません。


ページのコードは以下の通りです。
alert("Test"); はheadタグ内に出力されていません。
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link rel="stylesheet" href="Layout.css" />
    <title>Content2</title>
    

</head>
<body>

    <div class="Header">ヘッダ</div>
    <div>
        

<h1>TestPage - Content2</h1>
<p>コンテンツ2のテストページです。</p>

    </div>
    <div class="Footer">フッタ</div>


<!-- Visual Studio Browser Link -->
<script type="text/javascript" src="/_vs/browserLink" async="async" id="__browserLink_initializationData"
 data-requestId="37862c5805f745bbb357ce15d11628c2"data-requestMappingFromServer="false"
 data-connectUrl="http://localhost:53487/9c73d7ac66b8438ebf7e088d46c76441/browserLink"></script>
<!-- End Browser Link -->

<script src="/_framework/aspnetcore-browser-refresh.js"></script></body>
</html>
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2023-03-22
作成日: 2022-07-25
iPentec all rights reserverd.