Come modificare il nome visualizzato per LabelFor in razor in mvc3?


87

Nel motore razor ho usato il LabelFormetodo helper per visualizzare il nome

Ma il nome visualizzato sembra non essere buono da visualizzare. quindi ho bisogno di cambiare il mio nome visualizzato come farlo ....

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

Questa è una domanda molto vecchia, ma ancora molto rilevante per l'attuale codifica MVC. Ci sono problemi con le due soluzioni fornite finora, quindi ho aggiunto una risposta più dettagliata che copre tutte e 3 le opzioni disponibili.
Gone Coding

Risposte:


161

È possibile decorare la proprietà del modello di visualizzazione con l' [DisplayName]attributo e specificare il testo da utilizzare:

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

Oppure usa un altro overload dell'helper LabelFor che ti consente di specificare il testo:

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

E, no, non puoi specificare un nome di classe in MVC3 come hai provato a fare, poiché l' LabelForhelper non lo supporta. Tuttavia, questo funzionerebbe in MVC4 o 5.


@ raj2sekar1, se funziona e questa risposta ti ha aiutato a risolvere il problema che stavi riscontrando dovresti considerare di contrassegnarla come risposta facendo clic sul segno di spunta accanto ad essa: meta.stackexchange.com/questions/5234/…
Darin Dimitrov

8
Tuttavia, è necessario utilizzare System.ComponentModel.
yancyn

2
È stato utile, grazie. Ma penso che la tua risposta sarebbe migliore se avessi invece questo@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
Forse è stato scritto tempo fa, ma ora puoi specificare il nome della classe all'interno di LabelFor: ad es. @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
Ma se aggiorni il database, le classi del modello vengono rigenerate e perdi questo. Come lo eviti?
spessore

30

Questa era una vecchia domanda, ma le risposte esistenti ignorano il grave problema di buttare via gli attributi personalizzati quando si rigenera il modello. Aggiungo una risposta più dettagliata per coprire le attuali opzioni disponibili.

Hai 3 possibilità:

  • Aggiungi un [DisplayName("Name goes here")]attributo alla classe del modello di dati. Lo svantaggio è che questo viene gettato via ogni volta che si rigenerano i modelli di dati.
  • Aggiungi un parametro stringa al tuo file Html.LabelFor. es. @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})Riferimento: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx Lo svantaggio di questo è che devi ripetere l'etichetta in ogni vista.
  • Terza opzione. Utilizzare una classe di metadati allegata alla classe di dati (i dettagli seguono).

Opzione 3 - Aggiungi una classe di metadati:

Microsoft consente di decorare le proprietà su una classe Entity Framework, senza modificare la classe esistente ! Ciò avendo classi di metadati che si collegano alle classi del database (effettivamente un'estensione laterale della classe EF). Ciò consente di aggiungere attributi alla classe associata e non alla classe stessa in modo che le modifiche non vengano perse quando si rigenerano i modelli di dati .

Ad esempio, se la tua classe di dati è MyModelcon una SomekingStatusproprietà, potresti farlo in questo modo:

Prima dichiara una classe parziale con lo stesso nome (e utilizzando lo stesso spazio dei nomi), che ti consente di aggiungere un attributo di classe senza essere sovrascritto:

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

Tutte le classi del modello di dati generate sono classi parziali, che ti consentono di aggiungere proprietà e metodi extra semplicemente creando più classi con lo stesso nome (questoèmolto utile e spesso lo uso ad esempio per fornire versioni di stringa formattata di altri tipi di campo nel modello ).

Passaggio 2: aggiungi una classe di metatadati a cui fa riferimento la tua nuova classe parziale:

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

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

Appunti:

  • Dalla memoria, se inizi a utilizzare una classe di metadati, potrebbe ignorare gli attributi esistenti sulla classe effettiva ( [required]ecc.), Quindi potrebbe essere necessario duplicare quelli nella classe di metadati .
  • Questo non funziona per magia e non funzionerà solo con le classi. Il codice che cerca gli attributi di decorazione dell'interfaccia utente è progettato per cercare prima una classe di metadati.

C'è qualche motivo per cui questo non funzionerebbe in ASP.NET Core 3.1? [Obbligatorio] funziona, ma non [DisplayName ("la mia etichetta")]
John Pasquet,

15

È possibile modificare il testo delle etichette adornando la proprietà con l' DisplayNameattributo.

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

Oppure potresti scrivere il codice HTML grezzo in modo esplicito:

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

1
@shim: non dovresti lavorare direttamente con le classi del modello di database / dominio nelle tue viste, in genere ci sarebbe una classe intermedia "modello di visualizzazione" nel mezzo.
Vman

esattamente quello che stavo cercando utilizzando la sintassi dell'etichetta .. Grazie @xander
Asif Iqbal

1
Il problema con "scrivi il codice HTML grezzo in modo esplicito" è che dovrai scrivere tu stesso l'etichetta ogni volta che usi quel modulo. Sarebbe meglio dichiarare de DisplayName sul modello.
César León

4

Decora la proprietà del modello con l'attributo DisplayName.


1

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.