Question

I need to create custom html helper method. As far as I know there are two ways:

  1. Use @helper razor syntax. http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

  2. Create HtmlHelper extension method.

What solution is better and why? What are advantages and disadvantages?

I only read that in MVC 3 when @helper is created globally in seperate .cshtml file it's impossible to use other build-in html helpers. Don't know maybe in MVC 4 it is possisble.

Please help.

Was it helpful?

Solution 2

What solution is better and why?

It depends.

What are advantages and disadvantages?

  • Pros of custom HtmlHelper extension:
    • It will work no matter what view engine you are using
    • It is unit testable
    • It is portable between applications
  • Cons of custom HtmlHelper extension:
    • Could become cumbersome to write lots of HTML logic in C#
  • Pros of @helper:
    • Haven't seen any, I never use it
  • Cons of @helper:
    • Haven't seen any, I never use it

Actually the thing is that @helper is IMHO completely useless. When you want the advantages I mentioned about a custom HtmlHelper extension, you, well, build a custom HtmlHelper extension.

And if you are confronted to some of the disadvantages I mentioned about the custom HtmlHelper extension, you, well, use a partial view.

I only read that in MVC 3 when @helper is created globally in seperate .cshtml file it's impossible to use other build-in html helpers.

That's wrong. You could perfectly fine use other Html helpers. You just have to pass them as parameters:

@helper FooBar(HtmlHelper html) {
    feel free to use the html helper here
}

and when consuming from a view:

@HelperName.FooBar(Html)

OTHER TIPS

One benefit to @helper is that, since the code is within the view, you can make changes to it without having to recompile your code. This lets you tweak the helper quickly and easily during development. I personally prefer to keep markup within views if possible for this very reason.

A related benefit of @helper is that your HTML will benefit from intellisense, while writing HTML in C# code gets no such benefit.

Additionally, if you are writing a helper that is not meant to be re-usable outside of a single view, then @helper makes it easier to make that clear. An HtmlHelper extension method would be confusing if only one view is intended to use it (unless you manage to put it in a class and in a namespace where only that one view would ever see the extension method).

They can be like user controls Vs Custom Controls

Use @helper for razor style formatting in views. Use extension methods for generic solutions, for example overloading a label creation which takes additional parameters.

You can find detailed explanation with examples here

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top