views:

406

answers:

3

I created an html helper

Html.BreadCrumb(IDictionary<string, string> crumbs)

Where the first string is the label and the second string is the URL. The helper creates the html required (an unordered list, some classes for first element, current element, last element, dead element and separators etc) All working nice, but I do this by creating a stringbuilder, pumping all the html in it and returning the stringbuilder's content as a string.

I figure in this example it doesn't matter all that much, but what if an Html helper is churning out a big load of html? Isn't there a way to push it to Response.Write instead of a stringbuilder?

Or any other issues/improvements you have?

A: 

I don't think you will have any performance problems as long as the size of the HTML pages you produce is reasonable. And when you really start to create pages of megabytes in size, then you should ask yourself, why are you creating such huge HTML files?

Rene Saarsoo
There is some sence in that. Yet still I feel it would be better practice that way. Not?
borisCallens
+1  A: 

It certainly is possible to use Response.Write instead of returning a string; see the source for System.Web.Mvc.Ajax.Form (in AjaxExtensions.cs) in the MVC source for an example.

You then call the helper with <% instead of <%=.

Will it be any faster? I doubt it, but it's easy to test.

Craig Stuntz
+6  A: 

BTW we have a naming pattern in ASP.NET MVC for the various rendering techniques.

Helpers that return a string of what they are should be named what they are. For example, Url.Action() and Html.TextBox() return those exact items. Thus, these helpers should be used with the <%= %> syntax.

Helpers that render directly to the output stream should start with Render. For example, Html.RenderPartial(). These are used with the <% %> syntax.

Helpers that use the IDisposable pattern should be named with Begin/End. For example, Html.BeginForm() and Html.EndForm(). These should also be used with the <% %> syntax.

Thanks, Eilon

Eilon
Thanks for weighing in. Welcome to SO.
David Alpert
interesting. Didn't notice that before.
borisCallens