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.