none
ASP.NET MVC 4において、section内のpreタグで囲んだソースコードのエラー RRS feed

  • 質問

  • お世話になります。

    @section sec1 {
    <pre>
    if ( data == true )
        {
            for (inti = 0; i < 100; i++)
            {
            }    
        }    
    </pre>
        }
    


    上記のようなコードをpreタグで囲んでも、Razorのキーワードと認識してしまうようで、エラーになります。

    調査してみたのですが、section内で、if文にネストする形でfor文などが入ると、

    セクション ブロック ("@section Header { ... }") を入れ子にすることはできません。セクション ブロックは 1 レベルのみ許可されています

    というようなエラーがでます。

    回避する方法をご存知の方いませんでしょうか。

    よろしくお願いします。

    2017年10月29日 13:21

回答


  • preタグ内に出力したいコードを別ファイルで管理する形でもよいのであれば、コード部分を部分ビューに切り出す方法で対応できるかもしれません。


    例えば、表示したいコードをこのような形で「_PartialView1.cshtml」として作成しておき:
    <pre>
    if ( data == true )
    {
      for (inti = 0; i < 100; i++)
      {
         // hogehoge
      }
    }
    </pre>





    表示側で以下のように部分ビューとして読み込む:

    @section sec1{
      @Html.Partial("_PartialView1")
    }


    きよくらならみ

    • 回答としてマーク LASIK005 2017年10月30日 7:03
    2017年10月30日 5:41
  • きよくらならみ様、再度のご回答ありがとうございます。

    別ファイルにするのは管理が面倒だなと思い思案していたところ、ヘルパークラスをかますことでうまく回避できるならと思い、<を@Html.Raw("<")としたところうまくいきました。

    試してみたところ、私の環境では<をタグの開始と見なすようで、インテリセンスが動きます。>だとエラーも起こりません。

    色々ありがとうございました。

    • 回答としてマーク LASIK005 2017年10月30日 7:03
    2017年10月30日 7:03
  • とりあえずできれば何でも OK ということで終わりにしないで、話は最後まで聞きませんか?

    > C#のコードは直にcshtmlファイルにコピペしています。

    であれば、html のタグとして使わない < とか > はエスケープ(HTML エンコード)して、&lt; とか &gt; と書くのが普通のやり方です。

    質問者さんのケースでは以下のようにします。

    @section sec1 {
    <pre>
    if (data == true)
    {
        for (int i = 0; i &lt; 100; i++)
        {
        }
    }
    </pre>
    }

    それで問題は回避できますし、ブラウザには期待通りに表示されます。

    > <を@Html.Raw("<")としたところうまくいきました。

    それを回答としてマークするのはいかがなものかと思いますよ。

    とにかく、html のタグとして使わない < とか > をそのまま html ソースに書くのはダメです。

    • 回答としてマーク LASIK005 2017年10月30日 8:50
    2017年10月30日 8:35

すべての返信

  • このケースだと、『i < 100;』の 『<』がタグの開始文字と認識されてしまっているのかもしれません。

    少し試してみた結果、例えば『i <text><</text> 100;』このように該当部分を『<text></text>』で囲んでやると回避でるようです。


    きよくらならみ

    2017年10月30日 0:54
  • 質問者さんがアップされたコードをエラーなく実行するだけなら以下のようにすれば可能だと思います。(アップされたコードそのままでは動かないので訂正し、結果を見るために for ループの中に @i を追加したところは違います)

    @section sec1 {
         <pre>
         @{
             bool data = true;
             if (data == true)
             {
                 for (int i = 0; i < 100; i++)
                 {
                     @i
                 }
             }
         }
         </pre>
    }

    html コードにレンダリングされた結果は以下のようになります。(Windows 10, VS2010 Pro., .NET 4, MVC4, IIS 10, IE10 で検証しました)

    <pre>
    0123456789...中略...99
    </pre>

    でも、たぶんこれは質問者さんが真にやりたいこととは違うような気がします。

    もし違う場合は、やりたいことや質問の背景&全体のシナリオ・ストーリーを書いていただけませんか?

    全体的なやりたいことやストーリーのごく一部を切り出して質問すると、もしその質問が全体的なやりたいことを実現するのには見当違いだった場合、回答も当然やりたいことを実現するには的外れになってしまいます。そうすると、見当違いと的外れのやり取りが繰り返されるだけになって、なかなか解決にたどり着けません。時間の無駄でもありますし。

    あと、自分の開発環境(OS, ASP.NET, IIS, Visual Studio のバージョン、ブラウザは何かなど)も書いてください。質問するときのイロハのイです。

    2017年10月30日 1:52
  • Kiyokuraさま、ご回答ありがとうございます。

    確かにエラーにならないことを確認しました。

    ただ、長いC#のソースコードを表示したいのでもっと簡単な方法はないものかと思ってしまします。

    もう少し他の回答も待ってみたいと思います。

    ありがとうございました。

    2017年10月30日 3:48
  • SurferOnWwwさま、回答ありがとうございます。

    先に環境を書きたいと思います。

    Windows8.1,VS2013 Pro,ASP.NET MVC 4,IIS8.5,Chrome 61です。

    やりたいことは、Layoutファイルを使って、部分ビューのSectionで<pre>でC#のコードをただ表示したいだけです。

    わかりづらい表現ですみません。

    足りないところがありましたら、ご指摘お願いします。

    2017年10月30日 3:54

  • preタグ内に出力したいコードを別ファイルで管理する形でもよいのであれば、コード部分を部分ビューに切り出す方法で対応できるかもしれません。


    例えば、表示したいコードをこのような形で「_PartialView1.cshtml」として作成しておき:
    <pre>
    if ( data == true )
    {
      for (inti = 0; i < 100; i++)
      {
         // hogehoge
      }
    }
    </pre>





    表示側で以下のように部分ビューとして読み込む:

    @section sec1{
      @Html.Partial("_PartialView1")
    }


    きよくらならみ

    • 回答としてマーク LASIK005 2017年10月30日 7:03
    2017年10月30日 5:41
  • > C#のコードをただ表示したいだけです。

    その C# のコードはどこにどういう形で保存されていて、それをどのように取得して、どこにどのように表示するのですか? 具体的に、ここに書いてあること以外は知り得ない第三者が読んで分かるように、書いてください。

    2017年10月30日 6:33
  • きよくらならみ様、再度のご回答ありがとうございます。

    別ファイルにするのは管理が面倒だなと思い思案していたところ、ヘルパークラスをかますことでうまく回避できるならと思い、<を@Html.Raw("<")としたところうまくいきました。

    試してみたところ、私の環境では<をタグの開始と見なすようで、インテリセンスが動きます。>だとエラーも起こりません。

    色々ありがとうございました。

    • 回答としてマーク LASIK005 2017年10月30日 7:03
    2017年10月30日 7:03
  • SurferOnWwwさま、再度の投稿ありがとうございます。

    C#のコードは直にcshtmlファイルにコピペしています。

    サンプルコードと同じ感じです。

    きよくらならみ様の回答が参考になり、問題を解決できました。

    ありがとうございました。

    2017年10月30日 7:06
  • とりあえずできれば何でも OK ということで終わりにしないで、話は最後まで聞きませんか?

    > C#のコードは直にcshtmlファイルにコピペしています。

    であれば、html のタグとして使わない < とか > はエスケープ(HTML エンコード)して、&lt; とか &gt; と書くのが普通のやり方です。

    質問者さんのケースでは以下のようにします。

    @section sec1 {
    <pre>
    if (data == true)
    {
        for (int i = 0; i &lt; 100; i++)
        {
        }
    }
    </pre>
    }

    それで問題は回避できますし、ブラウザには期待通りに表示されます。

    > <を@Html.Raw("<")としたところうまくいきました。

    それを回答としてマークするのはいかがなものかと思いますよ。

    とにかく、html のタグとして使わない < とか > をそのまま html ソースに書くのはダメです。

    • 回答としてマーク LASIK005 2017年10月30日 8:50
    2017年10月30日 8:35
  • SurferOnWwwさま、回答ありがとうございます。

    そのエスケープは<pre>内では、変換されずそのまま表示されると思っておりました。

    教えてくださいありがとうございます。

    また何かありましたらよろしくお願いします。

    2017年10月30日 8:52
  • VS2013 でも提供されているかどうか分かりませんが、VS2012 以前には [代替の貼り付け] という便利な機能があるので紹介しておきます。(下の画像は VS2010 のもの)

    これを利用すると < とか > は自動的に HTML エンコードされてから貼り付けられます。詳しくは以下の記事を見てください。

    Visual Web Developer の HTML デザイナでの貼り付け操作
    https://msdn.microsoft.com/ja-jp/library/05xf99c0(v=vs.100).aspx


    2017年10月31日 2:48