28

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:

&lt;p&gt;Hello World &lt;/p&gt;

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.

animuson
  • 50,765
  • 27
  • 132
  • 142
BFree
  • 97,931
  • 20
  • 150
  • 197
  • Look at this: http://stackoverflow.com/questions/2293357/what-is-an-mvchtmlstring-and-when-should-i-use-it You should return IHtmlString – LukLed Jan 04 '11 at 18:14

1 Answers1

40

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 of HtmlString.

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

*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 the MvcHtmlString type was introduced as an intermediate step). All helpers targetting MVC 3 and higher should return IHtmlString.

marcind
  • 52,124
  • 12
  • 121
  • 111