6

プロジェクトでは、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="&lt;%=this.Id%&gt;"></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>

...マークアップを可能な限りそのままに保つため。

4

1 に答える 1

2

編集適切に提供されたコードを読んだ後:

これはバグのようです。何らかの形で id 属性に接続されています。属性を別のものに変更すると機能します。

@if(true) 
{   
    <select data-id="@Html.Raw(id)"></select>
}

明らかに、これは解決策ではなく、検証のみです。あなたの例4は多かれ少なかれ、それが設計によるものではないことを意味します。そうでなければ、それも失敗するはずです。

于 2012-11-28T13:19:47.413 に答える