web-dev-qa-db-fra.com

Attribut "Afficher" des annotations de données MVC 4

Je commence avec MVC 4 (moteur de vue rasoir). (Je pense que cela peut s'appliquer à MVC 3 et aux versions antérieures.) Je me demande s'il est avantageux d'utiliser l'annotation de données DisplayAttribute dans une vue par rapport à l'écriture d'une chaîne directement dans le code HTML. Par exemple, si j'avais le modèle suivant:

public class Thing
{
    public string WildAndCrazyProperty { get; set; }
}

... y aurait-il un avantage à annoter la propriété comme suit:

    [Display(Name = "Wild and Crazy")]
    public string WildAndCrazyProperty { get; set; }

... et que mon balisage soit:

<html>
    <body>
        <div>@Html.DisplayNameFor(modelItem => modelItem.WildAndCrazyProperty)</div>
        <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
    </body>
</html>

... versus ne pas avoir l'annotation, et faire:

<html>
    <body>
        <div>Wild and Crazy</div>
        <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
    </body>
</html>

La raison pour laquelle je n'ai pas mentionné Html.LabelFor dans ce cas, c’est que les données de la propriété sont affichées sous forme de texte statique (c’est-à-dire non modifiable) sur la page. Les données ne seront jamais modifiables sur cette page, je n’ai donc pas besoin d’utiliser Html.TextBoxFor dans le second <div> et ensuite utiliser le Html.LabelFor pour associer correctement une étiquette à cette zone de texte.

46
Kenneth K.

Si deux vues différentes partagent le même modèle (par exemple, l'une est destinée à la sortie mobile et l'autre est régulière), il pourrait être intéressant de laisser la chaîne résider à un seul endroit: sous forme de métadonnées sur le ViewModel.

De plus, si vous aviez une version héritée du modèle qui nécessitait un affichage différent, cela pourrait être utile. Par exemple:

public class BaseViewModel
{
    [Display(Name = "Basic Name")]
    public virtual string Name { get; set; }
}

public class OtherViewModel : BaseViewModel
{
    [Display(Name = "Customized Inherited Name")]
    public override string Name { get; set; }
}

Je vais admettre que cet exemple est assez artificiel ...

Ce sont les meilleurs arguments en faveur de l'utilisation de l'attribut que je peux trouver. Mon opinion personnelle est que, dans la plupart des cas, ce genre de chose est préférable de laisser au balisage.

55
eouw0o83hf

Outre les autres réponses, l'utilisation de DisplayAttribute présente un avantage considérable lorsque vous souhaitez localiser les champs. Vous pouvez rechercher le nom dans une base de données de localisation à l'aide de DisplayAttribute et il utilisera la traduction de votre choix.

En outre, vous pouvez laisser MVC générer les modèles pour vous en utilisant Html.EditorForModel() et il générera l'étiquette appropriée.

En fin de compte, c'est à vous de décider. Mais le MVC est très "centré sur le modèle", raison pour laquelle les attributs de données sont appliqués aux modèles, de sorte que les métadonnées existent à un seul endroit. Ce n'est pas comme si vous deviez faire beaucoup de dactylographie.

13
Erik Funkenbusch

L'un des avantages est que vous pouvez l'utiliser dans plusieurs vues et avoir un texte d'étiquette cohérent. Il est également utilisé par asp.net MVC scaffolding pour générer le texte des étiquettes et facilite la génération de texte explicite.

[Display(Name = "Wild and Crazy")]
public string WildAndCrazyProperty { get; set; }

"Wild and Crazy" apparaît de manière constante partout où vous utilisez la propriété dans votre application.

Parfois, cela n’est pas flexible car vous pouvez vouloir changer le texte dans certaines vues. Dans ce cas, vous devrez utiliser un balisage personnalisé, comme dans votre deuxième exemple.

8
codingbiz