11

I have an extension method that needs to return an HtmlString. The method has a loop which will build the HtmlString, however the HtmlString object has no Append method and does not allow concatenation using the + operator so I am not sure how I would build the HtmlString.

I'd like to use the StringBuilder but it doesn't have a ToHtmlString method...

Any solutions or patterns for this?

Judo
  • 5,167
  • 3
  • 24
  • 34
  • 2
    I think you should be able to build a normal stringbuilder with the HTML content and then output it wrapped in an @Html.Raw() call, would this solve the problem? – dougajmcdonald Oct 26 '11 at 12:44
  • Thanks - that worked great. Will draft an answer with code for this solution. – Judo Oct 26 '11 at 12:52
  • No problem, glad it helped, no point re-inventing the wheel if there's a helper for it! :) – dougajmcdonald Oct 26 '11 at 14:45
  • I prefer the answer by @swapneel as it leaves the door open for adding a RouteValueDictionary parameter to your extension method and have the relevent tag rendered in a MVC'y way. This applies whether you are rendering a single tag or a whole block of HTML. – Daniel Dyson Oct 26 '11 at 16:51
  • I am not sure if I get this right so I won't post it as an answer, but how about using your StringBuilder but adding an extension method to StringBuilder ToHtmlString? – Demetris Leptos Feb 27 '16 at 10:02

5 Answers5

34

Why not just build the string in a stringbuilder and then

return MvcHtmlString.Create(sb.ToString());
KyleMit
  • 30,350
  • 66
  • 462
  • 664
Tetaxa
  • 4,375
  • 1
  • 19
  • 25
12

I think you want to use TagBuilder. See also Using the TagBuilder Class to Build HTML Helpers like this:

// Create tag builder
var builder = new TagBuilder("img");

// Create valid id
builder.GenerateId(id);

// Add attributes
builder.MergeAttribute("src", url);
builder.MergeAttribute("alt", alternateText);
builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

// Render tag
return builder.ToString(TagRenderMode.SelfClosing);
KyleMit
  • 30,350
  • 66
  • 462
  • 664
swapneel
  • 3,061
  • 1
  • 25
  • 32
1

You could have a look at the fubu spin-off for creating HTML Tags. Here is a SO question that talks a bit about its usage.

Community
  • 1
  • 1
flq
  • 22,247
  • 8
  • 55
  • 77
1

You could write the ToHtmlString() method yourself as a extension method on StringBuilder.

Mattias Jakobsson
  • 8,207
  • 2
  • 34
  • 41
0

There are several solutions to this including using the TagBuilder, but using Html.Raw() worked very well for me:

public static IHtmlString HtmlMethod(this HtmlHelper htmlhelper, Object object)
{
    var sb = new StringBuilder();
    foreach (var item in object)
    {
        sb.Append(object.outputStr)
    }
    return htmlHelper.Raw(sb.ToString());
}
KyleMit
  • 30,350
  • 66
  • 462
  • 664
Judo
  • 5,167
  • 3
  • 24
  • 34