Jak zmienić wyświetlaną nazwę dla LabelFor w Razor w MVC3?


87

W maszynce do golenia użyłem LabelFor metody pomocniczej do wyświetlenia nazwy

Ale nazwa wyświetlana nie wydaje się być dobra do wyświetlenia. więc muszę zmienić swoją nazwę wyświetlaną, jak to zrobić ....

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

To bardzo stare pytanie, ale nadal bardzo istotne dla obecnego kodowania MVC. Do tej pory wystąpiły problemy z dwoma rozwiązaniami, dlatego dodałem bardziej szczegółową odpowiedź obejmującą wszystkie 3 dostępne opcje.
Gone Coding,

Odpowiedzi:


160

Możesz ozdobić swoją właściwość modelu widoku [DisplayName]atrybutem i określić używany tekst:

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

Lub użyj innego przeciążenia helpera LabelFor, który pozwala określić tekst:

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

I nie, nie możesz określić nazwy klasy w MVC3, tak jak próbowałeś to zrobić, ponieważ LabelForpomocnik tego nie obsługuje. Jednak zadziałałoby to w MVC4 lub 5.


@ raj2sekar1, jeśli to działa, a ta odpowiedź pomogła Ci rozwiązać problem, który miałeś, powinieneś rozważyć oznaczenie go jako odpowiedzi, klikając znacznik obok niego: meta.stackexchange.com/questions/5234/ ...
Darin Dimitrov

8
Musisz jednak użyć System.ComponentModel.
yancyn

2
To było przydatne, dziękuję. Ale myślę, że twoja odpowiedź byłaby lepsza, gdybyś zamiast tego miał to@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
Być może zostało to napisane jakiś czas temu, ale teraz możesz określić nazwę klasy wewnątrz LabelFor: np. @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
Ale jeśli zaktualizujesz bazę danych, klasy modelu zostaną ponownie wygenerowane i stracisz to. Jak tego uniknąć?
shim

30

To było stare pytanie, ale istniejące odpowiedzi pomijają poważny problem wyrzucania atrybutów niestandardowych podczas regeneracji modelu. Dodaję bardziej szczegółową odpowiedź, aby uwzględnić aktualnie dostępne opcje.

Masz 3 opcje:

  • Dodaj [DisplayName("Name goes here")]atrybut do klasy modelu danych. Wadą jest to, że jest to wyrzucane za każdym razem, gdy ponownie generujesz modele danych.
  • Dodaj parametr ciągu do pliku Html.LabelFor. np. @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})Odniesienie: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx Wadą jest to, że musisz powtórzyć etykietę w każdym widoku.
  • Trzecia opcja. Użyj klasy metadanych dołączonej do klasy danych (szczegóły poniżej).

Opcja 3 - Dodaj klasę metadanych:

Microsoft pozwala na dekorowanie właściwości w klasie Entity Framework, bez modyfikowania istniejącej klasy ! Dzieje się tak dzięki klasom metadanych, które są dołączane do klas bazy danych (w rzeczywistości boczne rozszerzenie klasy EF). Umożliwia to dodawanie atrybutów do skojarzonej klasy, a nie do samej klasy, dzięki czemu zmiany nie zostaną utracone podczas ponownego generowania modeli danych .

Na przykład, jeśli klasa danych MyModelo SomekingStatusnieruchomości, można zrobić to tak:

Najpierw zadeklaruj częściową klasę o tej samej nazwie (i używając tej samej przestrzeni nazw), co pozwala na dodanie atrybutu klasy bez przesłonięcia:

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

Wszystkie generowane klasy modelu danych są klasami częściowymi, które pozwalają na dodawanie dodatkowych właściwości i metod poprzez proste tworzenie większej liczby klas o tej samej nazwie (jest to bardzo przydatne i często używam go np. Do udostępnienia sformatowanych ciągowych wersji innych typów pól w modelu ).

Krok 2: Dodaj klasę metatadanych, do której odwołuje się Twoja nowa klasa częściowa:

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

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

Uwagi:

  • Z pamięci, jeśli zaczniesz używać klasy metadanych, może ona zignorować istniejące atrybuty w aktualnej klasie ([required] itp.), Więc może być konieczne zduplikowanie tych z klasy metadanych.
  • Nie działa to za pomocą magii i nie będzie działać tylko z żadnymi klasami. Kod, który szuka atrybutów dekoracji interfejsu użytkownika, został zaprojektowany w taki sposób, aby najpierw szukał klasy metadanych.

Czy jest jakiś powód, dla którego nie działałoby to w ASP.NET Core 3.1? [Wymagane] działa, ale nie [DisplayName ("my label")]
John Pasquet

15

Możesz zmienić tekst etykiet, ozdabiając nieruchomość DisplayNameatrybutem.

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

Lub możesz jawnie napisać surowy kod HTML:

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

1
@shim: Tak naprawdę nie powinieneś pracować bezpośrednio z klasami modelu bazy danych / domeny w swoich widokach, zazwyczaj między nimi będzie pośrednia klasa „modelu widoku”.
Vman,

Dokładnie to, czego szukałem, używając składni wytwórni… Dzięki @xander
Asif Iqbal

1
Problem z „jawnym napisaniem surowego kodu HTML” polega na tym, że za każdym razem, gdy użyjesz tego formularza, będziesz musiał sam napisać etykietę. Byłoby lepiej zadeklarować de DisplayName w modelu.
César León


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.