2017-10-02 5 views
1

J'ai un ENUM comme:EnumDropDownListFor avec valeur de chaîne Enum

public enum StateEnum 
{ 
    Updated = 0, 
    Pending = 1, 
    Failed = 2 
} 

La fonction d'aide @Html.EnumDropDownListFor(model => Model.State, "States") est rendu:

<select id="State" name="State"> 
    <option value="0">Updated</option> 
    <option value="1">Pending</option> 
    <option value="2">Failed</option> 
</select> 

Ma question est la suivante: comment avoir une valeur de chaîne de ENUM de la valeur option attribut au lieu de l'entier? Comme:

<select id="State" name="State"> 
    <option value="Updated">Updated</option> 
    <option value="Pending">Pending</option> 
    <option value="Failed">Failed</option> 
</select> 

(il serait plus facile à utiliser dans la page suivante Url)

je pourrais réécrire la fonction Html.EnumDropDownListFor dans une extension de HtmlHelper, mais il n'y a pas une meilleure solution?

+0

Vous pouvez toujours utiliser javascript pour mettre à jour l'attribut 'value' de chaque option, (ou écrire votre propre méthode d'extension) –

Répondre

0

Avec la réponse d'Andy, j'ai écrit un assistant mais je ne suis pas sûr que ce soit la meilleure façon de le faire. Si un organisme ont une meilleure solution

public static MvcHtmlString EnumDropDownListWithStringFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, string optionLabel, object htmlAttributes) 
{ 
    var selectListItem = Enum.GetNames(Nullable.GetUnderlyingType(typeof(TEnum))).Select(p => new SelectListItem() { Value = p, Text = p }).ToList(); 
    return SelectExtensions.DropDownListFor(htmlHelper, expression, selectListItem, optionLabel, htmlAttributes); 
} 
2

Vous pouvez obtenir toutes les valeurs de l'énumération en tant que chaînes en utilisant Enum.GetNames. Vous devez ensuite passer cette liste dans le modèle et la liste déroulante sera créée en utilisant @Html.DropDownListFor(x => x.Test, new SelectList(Model.Values)).

Vous pouvez le voir dans le violon suivant: https://dotnetfiddle.net/ynK4ss

+0

Merci c'est une solution, mais il peut être très hargneux si nous avoir plusieurs enum dans le modèle, je préfère écrire une extension d'aide – GGO

1

Vous pouvez créer un SelectList comme Andy suggéré ou vous pouvez avoir une propriété StateString avec un getter comme celui-ci:

public StateEnum State { get; set; } 

public string StateString 
{ 
    get { return State.ToString(); } 
} 

ou si State est la propriété de la chaîne, puis liez StateEnum dans le EnumDropDownListFor et changez le modèle en:

public StateEnum StateEnum { get; set; } 

public string State 
{ 
    get { return StateEnum.ToString(); } 
}