I was with a customer in Germany this week, and just before I left one of the (rather talented I might say) developers asked me about passing markup into an HtmlHelper extension. It turns out this is pretty easy, as covered by Phil Haack under Templated Razor Delegates. However, I particularly like keeping my HTML markup in cshtml files. It’s just easier to maintain. So I combined Phil’s post with the use of a partial view. The nice simple HtmlHelper extension looks like this;

 1: public static MvcHtmlString Region<TModel>( 
 2:    this HtmlHelper<TModel> html, 
 3:    Func<TModel, object> content) 
 4: { 
 5:    var result = content(html.ViewData.Model); 
 6:    return html.Partial("_Region", result); 
 7: } 

This accepts a Func<TModel, object> which is the Templated Razor Delegate. This is quite simply a snippet of Razor syntax that is executed to return markup as “result”.

 1: @Html.Region(@<text>@Model.WelcomeMessage</text>)

I’ve combined my HtmlHelper extension with a partial view named _Region, stored in the Shared folder;

 1: <fieldset class="demoregion"> 
 2:     <legend>A Region</legend> 
 3:     <div> 
 4:         @Model 
 5:     </div> 
 6: </fieldset>

This would be way neater if I could use an @helper under App_Code, but in MVC 3 that feature doesn’t support using HtmlHelper, so you couldn’t use Html.Textbox in the template, for example.

The code is attached – easy huh?