side net mvc formulario form data beginform asp c# asp.net html asp.net-mvc asp.net-mvc-3

c# - formulario - validation asp net mvc



Agregar su propio HtmlHelper en ASP.NET MVC 3 (2)

Soy nuevo en MVC y estoy tratando de crear mi propio método de extensión para que pueda agregar a los helpers html que están disponibles en mis vistas de afeitar. Html.DropDownListFor() permite crear una lista desplegable para cualquier propiedad de su modelo. Me gustaría crear un helper llamado Html.StateDropDownListFor() que haga exactamente lo mismo, excepto que carga el desplegable con los 50 estados de EE. UU. De esta forma, no tengo que crear una Lista de selección para cada menú desplegable de estado único que creo. ¿Cuál es la forma más fácil de hacer esto? En este momento tengo esto:

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

¿Estoy cerca? No quiero reconstruir un asistente de cuadro de texto completo, solo quiero crear un ayudante que utilice el cuadro de ayuda de cuadro de texto existente pero haga la lista de selección para mí. De esa manera, en mi opinión, podría hacer Html.StateDropDownList(x => x.State)

Sus respuestas son muy apreciadas.

¡Aquí está la respuesta!

Ustedes son una gran ayuda, ¡gracias! Aquí está el método de extensión completo en caso de que alguien más tenga un uso para él.

public static MvcHtmlString StateDropDownListFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) { Dictionary<string, string> stateList = new Dictionary<string, string>() { {"AL"," Alabama"}, {"AK"," Alaska"}, {"AZ"," Arizona"}, {"AR"," Arkansas"}, {"CA"," California"}, {"CO"," Colorado"}, {"CT"," Connecticut"}, {"DE"," Delaware"}, {"FL"," Florida"}, {"GA"," Georgia"}, {"HI"," Hawaii"}, {"ID"," Idaho"}, {"IL"," Illinois"}, {"IN"," Indiana"}, {"IA"," Iowa"}, {"KS"," Kansas"}, {"KY"," Kentucky"}, {"LA"," Louisiana"}, {"ME"," Maine"}, {"MD"," Maryland"}, {"MA"," Massachusetts"}, {"MI"," Michigan"}, {"MN"," Minnesota"}, {"MS"," Mississippi"}, {"MO"," Missouri"}, {"MT"," Montana"}, {"NE"," Nebraska"}, {"NV"," Nevada"}, {"NH"," New Hampshire"}, {"NJ"," New Jersey"}, {"NM"," New Mexico"}, {"NY"," New York"}, {"NC"," North Carolina"}, {"ND"," North Dakota"}, {"OH"," Ohio"}, {"OK"," Oklahoma"}, {"OR"," Oregon"}, {"PA"," Pennsylvania"}, {"RI"," Rhode Island"}, {"SC"," South Carolina"}, {"SD"," South Dakota"}, {"TN"," Tennessee"}, {"TX"," Texas"}, {"UT"," Utah"}, {"VT"," Vermont"}, {"VA"," Virginia"}, {"WA"," Washington"}, {"WV"," West Virginia"}, {"WI"," Wisconsin"}, {"WY"," Wyoming"}, {"AS"," American Samoa"}, {"DC"," District of Columbia"}, {"FM"," Federated States of Micronesia"}, {"MH"," Marshall Islands"}, {"MP"," Northern Mariana Islands"}, {"PW"," Palau"}, {"PR"," Puerto Rico"}, {"VI"," Virgin Islands"}, {"GU"," Guam"} }; return html.DropDownListFor(expression, new SelectList(stateList, "key", "value")); }

Modifiqué el código anterior para usar un diccionario de abreviaturas de estado.

Simplemente no olvides hacer referencia a System.Web.Mvc.Html en la parte superior de tu clase de método de extensión, como lo olvidé, ¡oh!


Para usar el método de ayuda personalizada en sus vistas de Razor, tendrá que ponerlo dentro del alcance. Hay dos formas posibles de hacer esto:

  1. Agregue un @using SomeNamespace en la parte superior de su vista con el espacio de nombres donde se define la clase estática que contiene el helper
  2. En ~/Views/web.config , agregue:

    <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>

Una vez que el asistente personalizado se pone dentro del alcance de la vista, Intellisense debería poder elegirlo y usted podría usarlo:

@Html.StateDropDownList()

Ahora tu método de ayuda necesita hacer algo útil. Puedes llamar a los ayudantes existentes:

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

o devuelve algunos datos personalizados:

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

Si tiene una vista fuertemente tipada y quiere usar una expresión:

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 --" ); } }

y entonces:

@Html.StateDropDownList()


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 ); }

Trabajaría. _stateList es un IEnumerable<SelectListItem> .