2010-02-19 225 views
205

documentationMvcHtmlString是不是非常有啓發性:什麼是MvcHtmlString,我應該什麼時候使用它?

表示,不應該再編碼的HTML編碼的字符串。

這不是很清楚,我什麼這正是其意義是。看起來有些HTML幫助程序方法返回MvcHtmlString,但我在線看到的一些自定義幫助程序的示例僅返回一個常規字符串。

問題:

什麼是MvcHtmlString

當我應該選擇MvcHtmlStringstring,反之亦然?爲什麼?

回答

240

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"]) %>

+0

我想補充一點,MVC 2是針對.Net 3.5而不是4編譯的。這意味着'MvcHtmlString'沒有實現'IHtmlString',因爲它只存在於4中。<%:'語法必須_duck-type_ - 無論接口如何,它總是會在'.ToString()'之前調用'.ToHtmlString()'。 – Keith 2010-07-08 07:49:13

+1

我站在更正 - 實際上'MvcHtmlString.Create'方法檢測是否有IHtmlString'可用並動態創建返回的類來支持它,如果它是:http://www.windowsitpro.com/article/net-framework/Encoding -and-Strings/3.aspx – Keith 2010-07-08 08:50:05

+0

在第二次閱讀時仍然是一個很好的答案:) – melaos 2011-11-09 07:41:24

6

,如果你想使用原始的HTML傳遞到MVC的輔助方法你會使用MvcHtmlString,你不希望輔助方法來編碼的HTML。

+0

嗯...我想一個HTML輔助方法的整個要點是編碼的HTML。我會怎麼使用HTML輔助方法,不這樣做? – devuxer 2010-02-19 00:47:08

+0

而且,除此之外,我什麼時候會想*回報* HTML助手方法中的'MvcHtmlString'? – devuxer 2010-02-19 00:49:07

+0

傳遞或返回。如果您的HTML幫助程序生成預先轉義的HTML,並且您不希望其他人重新轉義它,那麼您會希望返回一個。 – SLaks 2010-02-19 00:51:32

11

這是一個不錯的實際應用,如果你想製作自己的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,即使用<%: ... %>或將<%= ... %>都工作正常。

70

這是一個遲到的答案,但如果有人讀這個問題是使用剃鬚刀,你應該記住的是,剃刀編碼默認情況下,但在你的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

相關問題