Comment changer le nom d'affichage de LabelFor dans Razor dans MVC3?


87

Dans le moteur de rasoir, j'ai utilisé la LabelForméthode d'assistance pour afficher le nom

Mais le nom d'affichage ne semble pas bon à afficher. donc je dois changer mon nom d'affichage comment le faire ....

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 

C'est une question très ancienne, mais toujours très pertinente pour le codage MVC actuel. Il y a des problèmes avec les deux solutions proposées jusqu'à présent, j'ai donc ajouté une réponse plus détaillée couvrant les 3 options qui s'offrent à vous.
Fini le codage du

Réponses:


160

Vous pouvez décorer votre propriété de modèle de vue avec l' [DisplayName]attribut et spécifier le texte à utiliser:

[DisplayName("foo bar")]
public string SomekingStatus { get; set; }

Ou utilisez une autre surcharge de l'assistant LabelFor qui vous permet de spécifier le texte:

@Html.LabelFor(model => model.SomekingStatus, "foo bar")

Et, non, vous ne pouvez pas spécifier un nom de classe dans MVC3 comme vous avez essayé de le faire, car l' LabelForassistant ne le prend pas en charge. Cependant, cela fonctionnerait dans MVC4 ou 5.


@ raj2sekar1, si cela fonctionne et que cette réponse vous a aidé à résoudre le problème que vous aviez, vous devriez envisager de le marquer comme réponse en cliquant sur la coche à côté: meta.stackexchange.com/questions/5234/…
Darin Dimitrov

8
Vous devez cependant utiliser System.ComponentModel.
yancyn

2
Cela a été utile, merci. Mais je pense que votre réponse serait meilleure si vous aviez ceci à la place@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
Peut-être cela a-t-il été écrit il y a quelque temps, mais maintenant vous pouvez spécifier le nom de la classe à l'intérieur du LabelFor: par exemple @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
Mais si vous mettez à jour la base de données, les classes de modèle sont régénérées et vous perdez cela. Comment évitez-vous cela?
shim

30

C'était une vieille question, mais les réponses existantes ignorent le sérieux problème de la suppression des attributs personnalisés lorsque vous régénérez le modèle. J'ajoute une réponse plus détaillée pour couvrir les options actuellement disponibles.

Vous avez 3 options:

  • Ajoutez un [DisplayName("Name goes here")]attribut à la classe de modèle de données. L'inconvénient est que cela est jeté chaque fois que vous régénérez les modèles de données.
  • Ajoutez un paramètre de chaîne à votre Html.LabelFor. Par exemple, @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})Référence: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx L'inconvénient est que vous devez répéter l'étiquette dans chaque vue.
  • Troisième option. Utilisez une classe de métadonnées attachée à la classe de données (les détails suivent).

Option 3 - Ajouter une classe de métadonnées:

Microsoft permet de décorer les propriétés sur une classe Entity Framework, sans modifier la classe existante ! Ceci en ayant des classes de méta-données qui s'attachent à vos classes de base de données (effectivement une extension latérale de votre classe EF). Cela permet d'ajouter des attributs à la classe associée et non à la classe elle-même afin que les modifications ne soient pas perdues lorsque vous régénérez les modèles de données .

Par exemple, si votre classe de données est MyModelavec unSomekingStatus propriété, vous pouvez le faire comme ceci:

Déclarez d'abord une classe partielle du même nom (et en utilisant le même espace de noms), ce qui vous permet d'ajouter un attribut de classe sans être surchargé:

[MetadataType(typeof(MyModelMetaData))]
public partial class MyModel
{
}

Toutes les classes de modèle de données générées sont des classes partielles, qui vous permettent d'ajouter des propriétés et des méthodes supplémentaires en créant simplement plus de classes du même nom (c'est très pratique et je l'utilise souvent, par exemple pour fournir des versions de chaîne formatées d'autres types de champs dans le modèle ).

Étape 2: ajoutez une classe de métatadonnées référencée par votre nouvelle classe partielle:

public class MyModelMetaData
{
    // Apply DisplayNameAttribute (or any other attributes)
    [DisplayName("My New Label")]
    public string SomekingStatus;
}

Référence: https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute(v=vs.110).aspx

Remarques:

  • De mémoire, si vous commencez à utiliser une classe de métadonnées, elle peut ignorer les attributs existants sur la classe réelle ([required] etc.), vous devrez donc peut-être dupliquer ceux de la classe de métadonnées.
  • Cela ne fonctionne pas par magie et ne fonctionnera pas seulement avec toutes les classes. Le code qui recherche les attributs de décoration de l'interface utilisateur est conçu pour rechercher d'abord une classe de métadonnées.

Y a-t-il une raison pour laquelle cela ne fonctionnerait pas dans ASP.NET Core 3.1? [Obligatoire] fonctionne, mais pas [DisplayName ("my label")]
John Pasquet

15

Vous pouvez modifier le texte des étiquettes en ornant la propriété avec le DisplayName attribut.

[DisplayName("Someking Status")]
public string SomekingStatus { get; set; }

Ou, vous pouvez écrire explicitement le HTML brut:

<label for="SomekingStatus" class="control-label">Someking Status</label>

1
@shim: Vous ne devriez pas vraiment travailler directement avec les classes de modèle de base de données / domaine dans vos vues, il y aurait généralement une classe intermédiaire 'view-model' entre les deux.
Vman du

exactement ce que je cherchais en utilisant la syntaxe d'étiquette ... Merci @xander
Asif Iqbal

1
Le problème avec «écrire explicitement le HTML brut», c'est que vous devrez écrire vous-même l'étiquette chaque fois que vous utiliserez ce formulaire. Il serait préférable de déclarer de DisplayName sur le modèle.
César León

4

Décorez la propriété du modèle avec l'attribut DisplayName.


1

@ Html.LabelFor (model => model.SomekingStatus, "foo bar")

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.