Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding your own HtmlHelper in ASP.NET MVC 3

I am new to MVC and I am trying to create my own extension method so that I can add onto the html helpers that are available in my razor views. Html.DropDownListFor() lets you create a drop down list for any propery on your model. I would like to create a helper called Html.StateDropDownListFor() that does the exact same thing, except loads the drop down with all 50 US states. This way I don't have to create a SelectList for every single state drop down that I create. What is the easiest way to do this? Right now I have this:

public static class ExtensionMethods {     public static MvcHtmlString StateDropDownList(this HtmlHelper html)     {         // ???     } } 

Am I even close? I don't want to rebuild a whole text box helper, I just want to create a helper that utilizes the existing text box helper but does the SelectList for me. That way in my views I could just do Html.StateDropDownList(x => x.State)

like image 323
Chev Avatar asked Feb 19 '11 18:02

Chev


People also ask

How can I create my own HtmlHelper?

There are two ways in MVC to create custom Html helpers as below. We can create our own HTML helper by writing extension method for HTML helper class. These helpers are available to Helper property of class and you can use then just like inbuilt helpers. Add new class in MVC application and give it meaningful name.

What is MVC HtmlHelper?

What is HTML Helper in ASP.NET MVC 5? HTML Helpers are methods that return a string. Helper class can create HTML controls programmatically. HTML Helpers are used in View to render HTML content. It is not mandatory to use HTML Helper classes for building an ASP.NET MVC application.

How can add Cshtml file in ASP.NET MVC?

Right click the Views\HelloWorld folder and click Add, then click MVC 5 View Page with Layout (Razor). In the Specify Name for Item dialog box, enter Index, and then click OK. In the Select a Layout Page dialog, accept the default _Layout. cshtml and click OK.


2 Answers

To use the custom helper method in your Razor views you will need to bring it into scope. There are two possible ways to do this:

  1. Add a @using SomeNamespace in the top of your view with the namespace where the static class containing the helper is defined
  2. In ~/Views/web.config, add:

    <system.web.webPages.razor>     <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />         <pages pageBaseType="System.Web.Mvc.WebViewPage">             <namespaces>                 <add namespace="System.Web.Mvc" />                 <add namespace="System.Web.Mvc.Ajax" />                 <add namespace="System.Web.Mvc.Html" />                 <add namespace="System.Web.Routing" />                 <add namespace="SomeNamspace" />             </namespaces>         </pages>     </system.web.webPages.razor> 

Once the custom helper is brought into scope in the view, Intellisense should be able to pick it and you could use it:

@Html.StateDropDownList() 

Now you helper method needs to do something useful. You could either call existing helpers:

public static class ExtensionMethods {     public static MvcHtmlString StateDropDownList(this HtmlHelper html)     {         return html.TextBox("foo")     } } 

or return some custom data:

public static class ExtensionMethods {     public static MvcHtmlString StateDropDownList(this HtmlHelper html)     {         return MvcHtmlString.Create("Hello world");     } } 

If you have a strongly typed view and you wanted to use an expression:

using System.Web.Mvc; using System.Web.Mvc.Html;  public static class ExtensionMethods {     public static MvcHtmlString StateDropDownList(         this HtmlHelper<MyViewModel> html     )     {         var stateList = new SelectList(new[]         {             new { Key = "Alabama", Value = "Alabama" },             new { Key = "Idaho", Value = "Idaho" },             new { Key = "California", Value = "California" }         }, "Key", "Value");         return Html.DropDownListFor(             x => x.State, stateList, "-- Select a state --"         );     } } 

and then:

@Html.StateDropDownList() 
like image 175
Darin Dimitrov Avatar answered Sep 30 '22 18:09

Darin Dimitrov


using System.Web.Mvc.Html; public static MvcHtmlString StateDropDownList<TModel, TValue>( this HtmlHelper<TModel> html,     Expression<Func<TModel, TValue>> expression ) {         return html.DropDownListFor( expression, _stateList ); } 

Would work. _stateList being an IEnumerable<SelectListItem>.

like image 35
Bertrand Marron Avatar answered Sep 30 '22 19:09

Bertrand Marron