Wie ändere ich den Anzeigenamen für LabelFor in razor in mvc3?


87

In der Rasiermaschine habe ich die LabelForHilfsmethode verwendet, um den Namen anzuzeigen

Aber der Anzeigename scheint nicht gut anzuzeigen zu sein. Also muss ich meinen Anzeigenamen ändern, wie es geht ....

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

Dies ist eine sehr alte Frage, aber für die aktuelle MVC-Codierung immer noch sehr relevant. Es gibt Probleme mit den beiden bisher angebotenen Lösungen, daher habe ich eine detailliertere Antwort hinzugefügt, die alle drei verfügbaren Optionen abdeckt .
Gone Coding

Antworten:


160

Sie können Ihre Ansichtsmodelleigenschaft mit dem [DisplayName]Attribut dekorieren und den zu verwendenden Text angeben:

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

Oder verwenden Sie eine andere Überladung des LabelFor-Hilfsprogramms, mit der Sie den Text angeben können:

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

Und nein, Sie können in MVC3 keinen Klassennamen angeben, wie Sie es versucht haben, da der LabelForHelfer dies nicht unterstützt. Dies würde jedoch in MVC4 oder 5 funktionieren.


@ raj2sekar1, wenn es funktioniert und diese Antwort Ihnen bei der Lösung des Problems geholfen hat, sollten Sie es als Antwort markieren, indem Sie auf das Häkchen daneben klicken: meta.stackexchange.com/questions/5234/…
Darin Dimitrov

8
Sie müssen jedoch System.ComponentModel verwenden.
Yancyn

2
Das war nützlich, danke. Aber ich denke, Ihre Antwort wäre besser, wenn Sie dies stattdessen hätten@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
Vielleicht wurde dies vor einiger Zeit geschrieben, aber jetzt können Sie den Klassennamen im LabelFor angeben: zB @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
Wenn Sie jedoch die Datenbank aktualisieren, werden die Modellklassen neu generiert und Sie verlieren diese. Wie vermeidest du das?
Shim

30

Dies war eine alte Frage, aber vorhandene Antworten ignorieren das ernsthafte Problem, benutzerdefinierte Attribute wegzuwerfen, wenn Sie das Modell neu generieren. Ich füge eine detailliertere Antwort hinzu, um die derzeit verfügbaren Optionen abzudecken.

Sie haben 3 Möglichkeiten:

  • Füge hinzu ein [DisplayName("Name goes here")] der Datenmodellklasse Attribut hinzu. Der Nachteil ist, dass dies weggeworfen wird, wenn Sie die Datenmodelle neu generieren.
  • Fügen Sie Ihrem einen String-Parameter hinzu Html.LabelFor. zB @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})Referenz: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx Der Nachteil dabei ist, dass Sie das Etikett wiederholen müssen in jeder Sicht.
  • Dritte Option. Verwenden Sie eine Metadatenklasse, die an die Datenklasse angehängt ist (Details folgen).

Option 3 - Hinzufügen einer Metadatenklasse:

Microsoft ermöglicht das Dekorieren von Eigenschaften für eine Entity Framework-Klasse, ohne die vorhandene Klasse zu ändern ! Dies durch Metadatenklassen, die an Ihre Datenbankklassen angehängt werden (effektiv eine seitliche Erweiterung Ihrer EF-Klasse). Auf diese Weise können Attribute der zugeordneten Klasse und nicht der Klasse selbst hinzugefügt werden , sodass die Änderungen nicht verloren gehen, wenn Sie die Datenmodelle neu generieren .

Wenn sich Ihre Datenklasse beispielsweise MyModelin einer SomekingStatusEigenschaft befindet, können Sie dies folgendermaßen tun:

Deklarieren Sie zunächst eine Teilklasse mit demselben Namen (und unter Verwendung desselben Namespace), mit der Sie ein Klassenattribut hinzufügen können, ohne überschrieben zu werden:

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

Alle generierten Datenmodellklassen sind Teilklassen, mit denen Sie zusätzliche Eigenschaften und Methoden hinzufügen können, indem Sie einfach mehr Klassen mit demselben Namen erstellen (dies ist sehr praktisch und ich verwende es häufig, z. B. um formatierte Zeichenfolgenversionen anderer Feldtypen im Modell bereitzustellen ).

Schritt 2: Fügen Sie eine Metatadatenklasse hinzu, auf die Ihre neue Teilklasse verweist:

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

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

Anmerkungen:

  • Wenn Sie aus dem Speicher heraus eine Metadatenklasse verwenden, werden möglicherweise vorhandene Attribute der tatsächlichen Klasse ( [required]usw.) ignoriert, sodass Sie möglicherweise die Attribute in der Metadatenklasse duplizieren müssen.
  • Dies funktioniert nicht durch Magie und funktioniert nicht nur mit Klassen. Der Code, der nach UI-Dekorationsattributen sucht, sucht zuerst nach einer Metadatenklasse.

Gibt es einen Grund, warum dies in ASP.NET Core 3.1 nicht funktioniert? [Erforderlich] funktioniert, aber nicht [Anzeigename ("mein Label")]
John Pasquet

15

Sie können den Text der Beschriftungen ändern, indem Sie die Eigenschaft mit dem DisplayNameAttribut schmücken .

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

Oder Sie können den rohen HTML-Code explizit schreiben:

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

1
@shim: Sie sollten in Ihren Ansichten nicht direkt mit Datenbank- / Domänenmodellklassen arbeiten. In der Regel befindet sich dazwischen eine Zwischenklasse für das Ansichtsmodell.
Vman

Genau das, wonach ich gesucht habe, indem ich die Label-Syntax verwendet habe. Danke @xander
Asif Iqbal

1
Das Problem beim "expliziten Schreiben des rohen HTML-Codes" besteht darin, dass Sie das Etikett jedes Mal selbst schreiben müssen, wenn Sie dieses Formular verwenden. Es ist besser, de DisplayName im Modell zu deklarieren.
César León

4

Dekorieren Sie die Modelleigenschaft mit dem DisplayName-Attribut.


1

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.