web-dev-qa-db-fra.com

Ajout de votre propre HtmlHelper dans ASP.NET MVC 3

Je suis nouveau sur MVC et j'essaie de créer ma propre méthode d'extension pour pouvoir ajouter des aides html qui sont disponibles dans mes vues de rasoir. Html.DropDownListFor() vous permet de créer une liste déroulante pour toute propriété de votre modèle. Je voudrais créer un assistant appelé Html.StateDropDownListFor() qui fait exactement la même chose, sauf qu'il charge le menu déroulant avec les 50 états américains. De cette façon, je n'ai pas à créer une liste de sélection pour chaque liste déroulante d'état unique que je crée. Quelle est la manière la plus simple de faire ça? En ce moment, j'ai ceci:

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

Suis-je même proche? Je ne veux pas reconstruire un assistant de zone de texte entier, je veux juste créer un assistant qui utilise l'aide de zone de texte existante mais fait la SelectList pour moi. De cette façon, selon moi, je pourrais simplement faire Html.StateDropDownList(x => x.State)

Vos réponses sont très appréciées.

Voici la réponse!

Vous êtes d'une grande aide, merci! Voici la méthode d'extension terminée au cas où quelqu'un d'autre l'aurait jamais utilisée.

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

J'ai modifié le code ci-dessus pour utiliser un dictionnaire pour les abréviations d'état.

N'oubliez pas de référencer System.Web.Mvc.Html En haut de votre classe de méthode d'extension comme je l'ai oublié, d'oh!

47
Chev

Pour utiliser la méthode d'assistance personnalisée dans vos vues Razor, vous devrez la mettre à portée. Il existe deux façons possibles de procéder:

  1. Ajouter un @using SomeNamespace en haut de votre vue avec l'espace de noms où la classe statique contenant l'aide est définie
  2. Dans ~/Views/web.config, ajouter:

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

Une fois que l'assistant personnalisé est mis à portée dans la vue, Intellisense devrait pouvoir le sélectionner et vous pouvez l'utiliser:

@Html.StateDropDownList()

Maintenant, votre méthode d'assistance doit faire quelque chose d'utile. Vous pouvez soit appeler des assistants existants:

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

ou renvoyez des données personnalisées:

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

Si vous avez une vue fortement typée et que vous souhaitez utiliser une 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 --"
        );
    }
}

puis:

@Html.StateDropDownList()
70
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 );
}

Travaillerait. _stateList étant un IEnumerable<SelectListItem>.

8
Bertrand Marron