プロジェクトでは、Razor を使用して MVC 4 によって生成された JavaScript および HTML でテンプレートを作成するために jqote を使用しています。
HTML と Razor で次のコードを見てください。
<script id="testTemplate" type="text/html">
<p>Some html</p>
@{string id = "<%=this.Id%>";}
<!-- 1 -->
@if(true)
{
@Html.Raw(@"<select id="""+id+@"""></select>")
}
<!-- 2 -->
@if(true)
{
<select id="@Html.Raw(id)"></select>
}
<!-- 3 -->
@Html.Raw(@"<select id="""+id+@"""></select>")
<!-- 4 -->
<select id="@Html.Raw(id)"></select>
<!-- 5 -->
<select id="<%=this.Id%>"></select>
</script>
出力は次のとおりです。
<script id="testTemplate" type="text/html">
<!-- 1 -->
<select id="<%=this.Id%>"></select> <!--Good!-->
<!-- 2 -->
<select id="<%=this.Id%>"></select> <!--BAD!-->
<!-- 3 -->
<select id="<%=this.Id%>"></select> <!--Good!-->
<!-- 4 -->
<select id="<%=this.Id%>"></select> <!--Good!-->
<!-- 5 -->
<select id="<%=this.Id%>"></select> <!--Good!-->
</script>
ここで、問題は の下の 2 番目の選択にあります<!-- 2 -->
。がここで作動すると予想Html.Raw
されますが、どういうわけかそうではありません。または、Razor はそこにあるものを HtmlEncode したいと考えています。
質問は次のとおりです。誰かが理由を知っていますか? これはバグですか、それとも仕様ですか?
スクリプトタグがなくても機能します。ただし、JavaScript でテンプレート化する必要があるため、script タグが必要です。
ハードコーディングされたものは機能しますが、変数を使用する必要があります。これは常にテンプレートになるとは限らないためです。
なくて@if
も機能しますが、そこには必要です。
回避策
これらの行は、同様の適切な出力を提供します。
@if(true)
{
<select id= "@Html.Raw(id)"></select>
}
@if(true)
{
<select id ="@Html.Raw(id)"></select>
}
@if(true)
{
<select id @Html.Raw("=")"@Html.Raw(id)"></select>
}
これを行う予定です:
<script id="testTemplate" type="text/html">
@{string id = @"id=""<%=this.Id%>""";}
@if(true)
{
<select @Html.Raw(id)></select>
}
</script>
...マークアップを可能な限りそのままに保つため。