2010-12-07 7 views
0

J'essaye de créer des listes déroulantes automatiquement dans mon projet en créant ma propre méthode d'aide HTML qui prend un code de "groupe déroulant" et construit automatiquement le code HTML. Cependant, il doit le faire tout en soutenant pleinement le modèle.Personnalisation DropdownFor dans ASP.NET MVC2

Mon code de fin doit ressembler à ceci.

<%: Html.CodeList(m => m.state, 121) %> 

... où "121" est le groupe de code qui renvoie un dictionnaire de paires clé/valeur de la base de données.

Voici ce que j'ai pour ma méthode d'assistance Html jusqu'à maintenant.

public static MvcHtmlString CodeList<T, TProp>(this HtmlHelper<T> html, Expression<Func<T, TProp>> expr, int category) 
    { 
     Dictionary<int, string> codeList = CodeManager.GetCodeList(category); //returns dictionary of key/values for the dropdown 
     return html.DropDownListFor(expr, codeList, new Object()); //this line here is the problem 
    } 

Je ne peux pas comprendre comment ce exactement à la main à la méthode DropDownListFor. Je suppose que je retourne html.DropDownListFor() mais il me manque quelque chose d'évident. De l'aide?

Répondre

1

Là vous allez:

public static MvcHtmlString CodeList<T, TProp>(
    this HtmlHelper<T> html, 
    Expression<Func<T, TProp>> expr, 
    int category 
) 
{ 
    var codeList = CodeManager.GetCodeList(category); 

    var selectList = new SelectList(
     codeList.Select(item => new SelectListItem { 
      Value = item.Key.ToString(), 
      Text = item.Value 
     }), 
     "Value", 
     "Text" 
    ); 
    return html.DropDownListFor(expr, selectList); 
} 

Remarque: les méthodes statiques telles que CodeManager.GetCodeList sont très mauvais en termes d'unité de tester vos composants isolément.

+0

Comment recommanderiez-vous que je sépare le "GetCodeList" sans avoir à l'appeler moi-même chaque fois que je veux une liste déroulante? –