10
votes

Utilisation de [Affichage (Nom = "X")] avec une énumération. HTMLHelper personnalisé dans MVC3 ASP.NET

IM Utilisation d'un extrait de code d'une autre question Stackoverflow Question: xxx pré>

sur le côté mon Enum code>: p>

public enum Options
    {
       [Display(Name ="Yes")]
        0,
       [Display(Name = "No")]
        1,
      [Display(Name = "Other")]
        2,
    }


0 commentaires

3 Réponses :


0
votes

Vous avez probablement besoin d'une méthode d'extension pour votre Enum pour obtenir l'attribut d'affichage que vous avez mis sur vos options ENUM. Ensuite, lorsque vous recevez le nom ou la valeur de vos options, valeur Enum dans la méthode Radiobuttonforenum, vous appelez simplement la méthode d'extension pour remplir la valeur.

J'ai récemment écrit un article de blog sur ce sujet: http://joerijans.blogspot.com/2011/10/triple-door-extension-method-custom.html

J'espère que cela aide.


0 commentaires

0
votes

J'utilise [description] dans mon code, mais vous pouvez simplement modifier cela pour utiliser displayAttribute :

https://gist.github.com/1287511


0 commentaires

12
votes

Vous pouvez utiliser la réflexion pour récupérer la valeur:

public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression
)
{
    var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

    var sb = new StringBuilder();
    var enumType = metaData.ModelType;
    foreach (var field in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public))
    {
        var value = (int)field.GetValue(null);
        var name = Enum.GetName(enumType, value);
        var label = name;
        foreach (DisplayAttribute currAttr in field.GetCustomAttributes(typeof(DisplayAttribute), true))
        {
            label = currAttr.Name;
            break;
        }

        var id = string.Format(
            "{0}_{1}_{2}",
            htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
            metaData.PropertyName,
            name
        );
        var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
        sb.AppendFormat(
            "<label for=\"{0}\">{1}</label> {2}",
            id,
            HttpUtility.HtmlEncode(label),
            radio
        );
    }
    return MvcHtmlString.Create(sb.ToString());
}


3 commentaires

Cela fonctionne un régal, malheureusement, je ne reçois plus de valeur ajoutée automatiquement: @ html.radiobuttonforenum (m => m.Options)


@Rawrylions, à droite, j'ai mis à jour ma réponse pour résoudre ce problème. Cela devrait fonctionner maintenant comme prévu.


Des trucs fantastiques, merci pour l'aide. Je peux maintenant utiliser cela comme base pour créer enum à d'autres éléments de formulaire aussi :)