的documentation爲MvcHtmlString
是不是非常有啓發性:什麼是MvcHtmlString,我應該什麼時候使用它?
表示,不應該再編碼的HTML編碼的字符串。
這不是很清楚,我什麼這正是其意義是。看起來有些HTML幫助程序方法返回MvcHtmlString
,但我在線看到的一些自定義幫助程序的示例僅返回一個常規字符串。
問題:
什麼是MvcHtmlString
?
當我應該選擇MvcHtmlString
了string
,反之亦然?爲什麼?
的documentation爲MvcHtmlString
是不是非常有啓發性:什麼是MvcHtmlString,我應該什麼時候使用它?
表示,不應該再編碼的HTML編碼的字符串。
這不是很清楚,我什麼這正是其意義是。看起來有些HTML幫助程序方法返回MvcHtmlString
,但我在線看到的一些自定義幫助程序的示例僅返回一個常規字符串。
問題:
什麼是MvcHtmlString
?
當我應該選擇MvcHtmlString
了string
,反之亦然?爲什麼?
ASP.NET 4引入了一個新的代碼塊的語法<%: %>
。本質上,<%: foo %>
轉換爲<%= HttpUtility.HtmlEncode(foo) %>
。該小組正在試圖讓開發人員使用<%: %>
代替<%= %>
儘可能防止XSS。
然而,這引起了問題,如果代碼金塊已經編碼的結果是,<%: %>
語法將重新編碼它。這通過引入IHtmlString接口(在.NET 4中新增)解決。如果<%: foo() %>
的FOO()返回IHtmlString,該<%: %>
語法不會重新編碼。
MVC 2的助手返回MvcHtmlString,這在ASP.NET 4實現接口IHtmlString。因此,當開發人員在ASP.NET 4中使用<%: Html.*() %>
時,結果將不會被雙重編碼。
編輯:
這種新語法的一個直接好處是,你的意見是乾淨了一點。例如,您可以編寫而不是<%= Html.Encode(ViewData["anything"]) %>
。
,如果你想使用原始的HTML傳遞到MVC的輔助方法你會使用MvcHtmlString
,你不希望輔助方法來編碼的HTML。
這是一個不錯的實際應用,如果你想製作自己的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
,即使用<%: ... %>
或將<%= ... %>
都工作正常。
這是一個遲到的答案,但如果有人讀這個問題是使用剃鬚刀,你應該記住的是,剃刀編碼默認情況下,但在你的HTML輔助使用MvcHtmlString
你可以告訴剃鬚刀,它並不需要的一切編碼它。
如果你想剃刀不編碼字符串中使用
@Html.Raw("<span>hi</span>")
反編譯生(),向我們展示了它的包裹字符串中HtmlString
public IHtmlString Raw(string value) {
return new HtmlString(value);
}
「HtmlString只有在ASP存在.NET 4.
MvcHtmlString是添加到MVC 2兼容性墊片以支持.NET 3.5和.NET 4.現在MVC 3僅僅是.NET 4,它是HtmlString的一個相當簡單的子類,可能對於源代碼兼容性的MVC 2> 3來說。「 source
我想補充一點,MVC 2是針對.Net 3.5而不是4編譯的。這意味着'MvcHtmlString'沒有實現'IHtmlString',因爲它只存在於4中。<%:'語法必須_duck-type_ - 無論接口如何,它總是會在'.ToString()'之前調用'.ToHtmlString()'。 – Keith 2010-07-08 07:49:13
我站在更正 - 實際上'MvcHtmlString.Create'方法檢測是否有IHtmlString'可用並動態創建返回的類來支持它,如果它是:http://www.windowsitpro.com/article/net-framework/Encoding -and-Strings/3.aspx – Keith 2010-07-08 08:50:05
在第二次閱讀時仍然是一個很好的答案:) – melaos 2011-11-09 07:41:24