MvcHtmlString和HtmlString似乎是一个简单的字符串周围无用的包装?

时间:2013-09-05 09:11:15

标签: c# asp.net .net asp.net-mvc

我正在查看MvcHtmlString及其基类HtmlString的源代码,这两个类似于字符串周围的无用包装。

我记得有一次我做过这个练习并看到了好处,但现在还记不住了。当时我花了很多时间研究MvcHtmlString,其中一个我学到的东西是它的(静态显然)工厂方法Create因{{1引入无参数ctor'而变得多余}。class。

但我似乎无法记住或找到我的分析或关于这些类添加到普通字符串之上的服务的注释。

那么这些课程的用途是什么?

1 个答案:

答案 0 :(得分:9)

它们的主要目的是实现ASP.NET 4.0中引入的IHtmlString标记接口。

这是ASP.NET 4.0+的自动编码功能的一部分。在ASP.NET 4.0之前,我们只提供了这种语法:

<%= … %>

这只是将字符串注入生成的HTML中。在4.0中添加了以下语法:

<%: … %>

这是我们现在应该使用的语法。旧语法的不同之处在于字符串将由框架进行HTML编码。

但是在某些情况下我们不想对字符串进行编码,因为它已经是一个正确编码的HTML(例如它是HtmlHelper的输出)。在这种情况下,我们应该返回一个实现IHtmlString的类。新语法将很乐意接受这个而不是字符串,并且不会尝试对此进行编码,它只会输出接口的.ToHtmlString()方法返回的字符串。这样我们就不会想到是否应该使用旧语法或新语法。

现在可以问为什么有HtmlStringMvcHtmlString类。答案是Razor。剃刀语法:

@...

默认情况下也编码所有内容。现在,Razor是在ASP.NET MVC 2.0中引入的,它能够在.Net Framework 3.5上运行,并且没有IHtmlStringHtmlString - MvcHtmlString是Razor的标记类,现在它只是为了向后兼容而保留。