回答:
ASP.NET 4では、新しいコードナゲット構文が導入されています<%: %>
。本質的に、に<%: foo %>
変換され<%= HttpUtility.HtmlEncode(foo) %>
ます。チームは、開発者がXSSを防ぐため<%: %>
に、<%= %>
可能な限り代わりに使用するように努めています。
ただし、これにより、コードナゲットがその結果をすでにエンコードしている場合、<%: %>
構文によって再エンコードされるという問題が発生します。これは、IHtmlStringインターフェイス(.NET 4の新機能)の導入によって解決されました。foo()が<%: foo() %>
IHtmlString を返す場合、<%: %>
構文はそれを再エンコードしません。
MVC 2のヘルパーはMvcHtmlStringを返します。MvcHtmlStringはASP.NET 4でインターフェイスIHtmlStringを実装します。したがって、開発者<%: Html.*() %>
がASP.NET 4で使用する場合、結果は二重にエンコードされません。
編集:
この新しい構文の直接的な利点は、ビューが少しクリーンになることです。たとえば、の<%: ViewData["anything"] %>
代わりに書くことができます<%= Html.Encode(ViewData["anything"]) %>
。
MvcHtmlString.Create
の方法の検出されたか否かをIHtmlString
利用可能であり、動的にそれがある場合はそれをサポートするために返されたクラスを作成します。windowsitpro.com/article/net-framework/Encoding-and-Strings/...
これは遅い回答ですが、この質問を読んでいる人がかみそりを使用している場合、覚えておくべきことは、かみそりはデフォルトですべてをエンコードすることですがMvcHtmlString
、htmlヘルパーを使用することで、かみそりにエンコードする必要がないことを伝えることができます。
かみそりで文字列をエンコードしないようにするには
@Html.Raw("<span>hi</span>")
Raw()を逆コンパイルすると、文字列がHtmlStringにラップされていることがわかります。
public IHtmlString Raw(string value) {
return new HtmlString(value);
}
" HtmlStringはASP.NET 4にのみ存在します。
MvcHtmlStringは、.NET 3.5と.NET 4の両方をサポートするためにMVC 2に追加された互換性シムでした。MVC3は.NET 4のみであるため、おそらくソース互換性のためにMVC 2-> 3のHtmlStringのかなり自明なサブクラスです。" ソース
これは、独自のHtmlHelper
拡張機能を作成する場合に便利です。たとえば、<link>
タグの構文を覚えようとするのは嫌なので、タグを作成するための独自の拡張メソッドを作成しました<link>
。
<Extension()> _
Public Function CssBlock(ByVal html As HtmlHelper, ByVal src As String, ByVal Optional ByVal htmlAttributes As Object = Nothing) As MvcHtmlString
Dim tag = New TagBuilder("link")
tag.MergeAttribute("type", "text/css")
tag.MergeAttribute("rel", "stylesheet")
tag.MergeAttribute("href", src)
tag.MergeAttributes(New RouteValueDictionary(htmlAttributes))
Dim result = tag.ToString(TagRenderMode.Normal)
Return MvcHtmlString.Create(result)
End Function
String
このメソッドから戻ることもできましたが、次の場合は壊れます。
<%: Html.CssBlock(Url.Content("~/sytles/mysite.css")) %>
ではMvcHtmlString
、どちらか一方<%: ... %>
または<%= ... %>
両方を使用すると正しく機能します。
あなたは使用することになりMvcHtmlString
ますが、MVCヘルパーメソッドに生のHTMLを渡したい場合、あなたはヘルパーメソッドは、HTMLをエンコードする必要はありません。
MvcHtmlString
HTMLヘルパーメソッドから?
MvcHtmlString
実装されないことを意味しますIHtmlString
。<%:
構文はダックタイプでなければなりません。インターフェイス.ToHtmlString()
に.ToString()
関係なく、常に前に呼び出されます。