@section 内で記述されたタグがページ表示時に実体参照の表現になってしまう

げんとー
質問: @section内のタグの記号が文字化けしてしまう
Razor Pagesでページを実装したのですが、出力されたHTMLページのコードを確認すると、 @section内に記述したタグの文字のうち記号の文字が &#xnnnn の出力になってしまいます。 記述したとおりの文字で表示する方法はありますか?

現象の確認

ASP.NET Core アプリケーションを作成し、以下のRazor Pageを作成します。

_Layout1.cshtml
<!DOCTYPE html>

<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>@ViewBag.Title</title>
  @RenderSection("MyScripts", required: false)
</head>
<body>
  <div>
    @RenderBody()
  </div>
</body>
</html>

SimpleDemoPage.cshtml
@page
@using Microsoft.Extensions.Configuration;
@model RazorPagesCustomTagHelper.Pages.SimpleDemoPageModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

@{
  Layout = "~/Pages/_Layout1.cshtml";
}
@section MyScripts {
  <script type="application/ld+json">
    {
      "id":101,
      "name":"ペンギン",
      "code":"PEN-001"
    }
  </script>
}

<html>
  <head>
    <title>テスト用ページ</title>
    
  </head>
  <body>
    <h1>HTMLタグの確認デモページ</h1>
    <p>あいうえお</p>
  </body>
</html>

SimpleDemoPage.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPagesCustomTagHelper.Pages
{
    public class SimpleDemoPageModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

上記のプロジェクトを実行し、(Webアプリケーションルート)/SimpleDemoPage のURLを開きます。下図のページが表示されます。
@section 内で記述されたタグがページ表示時に実体参照の表現になってしまう:画像1

出力されているHTMLのコードを確認します。
@section 内で記述されたタグがページ表示時に実体参照の表現になってしまう:画像2

<script type="application/ld+json"> の部分が <script type="application/ld&#x2B;json"> と表現されています。
@section 内で記述されたタグがページ表示時に実体参照の表現になってしまう:画像3


なお、@section を利用しない場合は実体参照にはなりません。以下のコードで実行結果を確認します。

_Layout1.cshtml
<!DOCTYPE html>

<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>@ViewBag.Title</title>
  <script type="application/ld+json">
    {
      "id":101,
      "name":"ペンギン",
      "code":"PEN-001"
    }
  </script>
</head>
<body>
  <div>
    @RenderBody()
  </div>
</body>
</html>

SimpleDemoPageNoSection.cshtml
@page
@model RazorPagesCustomTagHelper.Pages.SimpleDemoPageNoSectionModel
@{
  Layout = "~/Pages/_Layout2.cshtml";
}
<html>
<head>
  <title>テスト用ページ</title>

</head>
<body>
  <h1>HTMLタグの確認デモページ</h1>
  <p>セクションを使わない場合のデモ</p>
</body>
</html>

SimpleDemoPageNoSection.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPagesCustomTagHelper.Pages
{
    public class SimpleDemoPageNoSectionModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

上記のコードは@sectionを利用していません。
@section 内で記述されたタグがページ表示時に実体参照の表現になってしまう:画像4

出力されたコードを確認します。<script type="application/ld+json"> で表現されています。
@section 内で記述されたタグがページ表示時に実体参照の表現になってしまう:画像5 @section 内で記述されたタグがページ表示時に実体参照の表現になってしまう:画像6

対処法

@sectionのタグを実体参照の表記にしない方法として、 カスタムのタグヘルパーを作成する方法がわかりやすいです。

はじめに以下のクラスを記述します。カスタムのタグヘルパーのクラスになります。
output.TagNameは出力するタグ名になります。今回の例では、タグヘルパーを通すことで、raw-script タグを script タグに変換します。
output.TagMode = TagMode.StartTagAndEndTag;により、開始と終了タグがあるタグであることを指定しています。

RawScriptTagHelper.cs
using Microsoft.AspNetCore.Razor.TagHelpers;

namespace RazorPagesCustomTagHelper
{
  [HtmlTargetElement("raw-script", Attributes = "type")]
  public class RawScriptTagHelper : TagHelper
  {
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
      output.TagName = "script";                    // Change <raw-script> to <script>
      output.TagMode = TagMode.StartTagAndEndTag;   // Ensure it's not self-closing
      output.Content.SetHtmlContent(output.GetChildContentAsync().Result.GetContent());
    }
  }
}

以下のコードはraw-scriptタグ内の文字列をそのまま結果として出力する処理となります。

output.Content.SetHtmlContent(output.GetChildContentAsync().Result.GetContent());


続いてRazorPageを修正します。実体参照表示したくない<script> タグを <raw-script> タグとして記述します。 また、TagHelperを参照するための@addTagHelperを記述します。

addTagHelperの書式は次の通りです。

@addTagHelper *, (プロジェクトのネームスペース)

SimpleCustomTagHelper.cshtml
@page
@model RazorPagesCustomTagHelper.Pages.SimpleCustomTagHelperModel
@addTagHelper *, RazorPagesCustomTagHelper
@{
  Layout = "~/Pages/_Layout3.cshtml";
}
@section MyScripts {
  <raw-script type="application/ld+json">
    {
      "id":101,
      "name":"ペンギン",
      "code":"PEN-001"
    }
  </raw-script>
}

<html>
<head>
  <title>テスト用ページ</title>

</head>
<body>
  <h1>HTMLタグの確認デモページ</h1>
  <p>あいうえお</p>
</body>
</html>

実行結果

プロジェクトを実行します。(Webアプリケーションルート)/SimpleCustomTagHelper のURLを開きます。下図のページが表示されます。
@section 内で記述されたタグがページ表示時に実体参照の表現になってしまう:画像7

HTMLのコードを表示します。@section 内で記述されているタグraw-scriptsctipt タグに変換され、+ の記号も実体参照の表現にはなっていません。
@section 内で記述されたタグがページ表示時に実体参照の表現になってしまう:画像8

@section 内で記述されたタグを実体参照の表現にしない動作が実現できました。


AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2025-03-24
Copyright © 1995–2025 iPentec all rights reserverd.