使用新的Razor View引擎,我的HtmlHelpers应该返回字符串还是IHtmlString?

BFr*_*ree 28 c# asp.net-mvc html-encode razor

使用Razor View Engine,只要您将字符串直接输出到页面,它就是HTML编码的.例如:

@"<p>Hello World</p>"
Run Code Online (Sandbox Code Playgroud)

实际上将输出到页面:

&lt;p&gt;Hello World &lt;/p&gt;
Run Code Online (Sandbox Code Playgroud)

哪个会在浏览器中显示为:

<p> Hello World </ p>

这里的问题是,在创建Html帮助程序时,到目前为止,使用旧的aspx视图引擎,我只返回一个字符串,并将其输出到浏览器:

<%= Html.MyCoolHelperMethod(); %>
Run Code Online (Sandbox Code Playgroud)

所以我的问题基本上就是这个.我这样做:

public static IHtmlString MyCoolHelperMethod(this HtmlHelper helper)
{
   return new helper.Raw("<p>Hello World</p>");
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以在我的cshtml中执行此操作:

@Html.MyCoolHelperMethod();
Run Code Online (Sandbox Code Playgroud)

或者我这样做:

public static string MyCoolHelperMethod(this HtmlHelper helper)
{
   return "<p>Hello World</p>";
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我需要在我的cshtml中完成工作:

@Html.Raw(Html.MyCoolHelperMethod());
Run Code Online (Sandbox Code Playgroud)

显然,第一种方法使视图看起来更清晰,但我只是想知道普通模式是否实际上是帮助者返回IHtmlString并且我过去做错了.

mar*_*ind 40

在大多数情况下,您应该返回一个实例IHtmlString.这就是内置助手*所遵循的模式,这意味着帮助者的消费者不需要担心编码不足或过度编码.

Raw您应该只返回一个新的实例,而不是使用该函数HtmlString.

public static IHtmlString MyCoolHelperMethod(this HtmlHelper helper) {
    return new HtmlString("<p>Hello World</p>");
}
Run Code Online (Sandbox Code Playgroud)

*请注意,MVC 3实际上MvcHtmlString用作其助手的返回类型,但这是MVC 2天的延迟.(复杂的故事,但简而言之,IHtmlString仅在.NET 4中引入,并且由于MVC 2支持.NET 3.5,MvcHtmlString因此引入了类型作为中间步骤).所有针对MVC 3及更高版本的助手都应该返回IHtmlString.