あなたはこのようなことをすることができます(少なくともMVC3では):
<td align="left" @(isOddRow ? "class=TopBorder" : "style=border:0px") >
私がかみそりで引用を追加していると私が信じていたのは、実際にはブラウザーだ。MVC 4でテストしたときにRismが指摘したように(MVC 3ではテストしていませんが、動作は変更されていないと思います)、これは実際には生成されclass=TopBorder
ますが、ブラウザーはこれをうまく解析できます。HTMLパーサーは、欠落している属性の引用を多少許容しますが、スペースや特定の文字がある場合、これは壊れる可能性があります。
<td align="left" class="TopBorder" >
または
<td align="left" style="border:0px" >
あなた自身の引用を提供することで何がうまくいかない
ネストされた引用に通常のC#規則を使用しようとすると、Razorが安全にエスケープしようとするため、見積もりよりも多くの引用ができてしまいます。例えば:
<button type="button" @(true ? "style=\"border:0px\"" : string.Empty)>
これは評価されるはずです<button type="button" style="border:0px">
が、RazorはC#からのすべての出力をエスケープして、次のように生成します。
style="border:0px"
これは、ネットワーク経由で応答を表示した場合にのみ表示されます。HTMLインスペクタを使用する場合、実際のHTMLではなく、実際にはDOMが表示されることがよくあります。ブラウザはHTMLを解析してDOMに変換し、解析後のDOM表現にはすでにいくつかの優れた機能が適用されています。この場合、ブラウザは属性値の前後に引用符がないことを確認し、それらを追加します。
style=""border:0px""
しかし、DOMインスペクターでは、HTML文字コードが正しく表示されるため、実際に次のように表示されます。
style=""border:0px""
Chromeでは、右クリックして[HTMLの編集]を選択すると元に戻り、厄介なHTML文字コードが表示されるため、実際の外部引用符とHTMLエンコードされた内部引用符があることがわかります。
したがって、自分で引用しようとする場合の問題は、Razorがこれらをエスケープすることです。
見積もりを完全に管理したい場合
Html.Rawを使用して引用がエスケープされないようにします。
<td @Html.Raw( someBoolean ? "rel='tooltip' data-container='.drillDown a'" : "" )>
としてレンダリング:
<td rel='tooltip' title='Drilldown' data-container='.drillDown a'>
変数からHTMLを出力しないため、上記は完全に安全です。関係する唯一の変数は三項条件です。ただし、この最後の手法では、ユーザーが入力したデータから文字列を作成する場合に、特定のセキュリティ問題が発生する可能性があることに注意してください。たとえば、ユーザーが入力したデータに由来するデータフィールドから属性を構築した場合、Html.Rawを使用すると、文字列に属性とタグの途中の終わりが含まれる可能性があり、現在ログインしている代わりに何かを行うスクリプトタグを開始します。ユーザー(ログインしているユーザーと異なる場合があります)。たぶん、すべてのユーザーの写真のリストを含むページがあり、ツールチップを各ユーザーのユーザー名に設定し、1人のユーザーが自分の名前を付けている'/><script>$.post('changepassword.php?password=123')</script>
そして今、このページを閲覧する他のすべてのユーザーのパスワードは、悪意のあるユーザーが知っているパスワードに即座に変更されます。