我正在查看其源代码MvcHtmlString
及其基类HtmlString
,这两者似乎都是围绕字符串的无用包装器。
我记得有一次我做过这个练习并看到了好处,但现在不记得了。当时我花了很多时间研究 ,MvcHtmlString
我学到的一件事是,它的(显然是静态的)工厂方法Create
通过在MvcHtmlString
类中引入无参数 ctor 变得多余。
但我似乎不记得或找不到我对这些类在普通字符串之外添加什么服务的分析或注释。
那么这些类有什么用呢?
我正在查看其源代码MvcHtmlString
及其基类HtmlString
,这两者似乎都是围绕字符串的无用包装器。
我记得有一次我做过这个练习并看到了好处,但现在不记得了。当时我花了很多时间研究 ,MvcHtmlString
我学到的一件事是,它的(显然是静态的)工厂方法Create
通过在MvcHtmlString
类中引入无参数 ctor 变得多余。
但我似乎不记得或找不到我对这些类在普通字符串之外添加什么服务的分析或注释。
那么这些类有什么用呢?
它们的主要目的是实现IHtmlString
ASP.NET 4.0 中引入的标记接口。
这是 ASP.NET 4.0+ 的自动编码功能的一部分。在 ASP.NET 4.0 之前,我们只有以下语法可用:
<%= … %>
这只是将字符串注入到生成的 HTML 中。在 4.0 中添加了以下语法:
<%: … %>
这是我们现在都应该使用的语法。与旧语法的不同之处在于字符串将由框架编码为 HTML。
但是在某些情况下,我们不想对字符串进行编码,因为它已经是正确编码的 HTML(例如,它是来自 的输出HtmlHelper
)。在这种情况下,我们应该返回一个实现IHtmlString
. 新语法会很乐意接受 this 而不是 string 并且不会尝试对其进行编码,它只会输出.ToHtmlString()
接口方法返回的 string。这样我们就不用考虑是否应该使用旧语法或新语法。
现在有人可以问为什么有一个HtmlString
和MvcHtmlString
类。答案是剃刀。剃刀语法:
@...
默认情况下也对所有内容进行编码。现在 Razor 是在 ASP.NET MVC 2.0 中引入的,它能够在 .Net Framework 3.5 上工作,并且没有IHtmlString
或HtmlString
没有 - MvcHtmlString
Razor 的标记类,现在保留它只是为了向后兼容。