With the Razor View Engine, anytime you output a string directly to the page, it's HTML encoded. e.g.:
@"<p>Hello World</p>"
will actually get output to the page as:
<p>Hello World </p>
Which would show up in the browser as:
<p>Hello World </p>
Here's the problem though, when creating Html helpers, till now, with the old aspx view engine I would just return a string, and output that to the browser:
<%= Html.MyCoolHelperMethod(); %>
So my question is basically this. Do I do this:
public static IHtmlString MyCoolHelperMethod(this HtmlHelper helper)
{
return new helper.Raw("<p>Hello World</p>");
}
in which case I can just do this in my cshtml:
@Html.MyCoolHelperMethod();
or do I do this:
public static string MyCoolHelperMethod(this HtmlHelper helper)
{
return "<p>Hello World</p>";
}
in which case I need to do the work in my cshtml:
@Html.Raw(Html.MyCoolHelperMethod());
Obviously the first approach makes the view look a lot cleaner, but I'm just wondering if the common pattern is in fact for helpers to return an IHtmlString
and I've been doing it wrong in the past.
In most cases you should return an instance of
IHtmlString
. That's the pattern followed by the built-in helpers* and it means that the consumer of a helper does not need to worry about under- or over-encoding.Instead of using the
Raw
function you should probably just return a new instance ofHtmlString
.*Note that MVC 3 actually uses
MvcHtmlString
as the return type of its helpers but this is a holdover from the MVC 2 days. (Complicated story, but in short,IHtmlString
was only introduced in .NET 4 and since MVC 2 supported .NET 3.5 theMvcHtmlString
type was introduced as an intermediate step). All helpers targetting MVC 3 and higher should returnIHtmlString
.