Bagaimana cara mengubah nama tampilan untuk LabelFor di pisau cukur di MVC3?

87

Di mesin silet saya telah menggunakan LabelFormetode pembantu untuk menampilkan nama

Namun nama tampilan tersebut sepertinya kurang bagus untuk ditampilkan. jadi saya perlu mengubah nama tampilan saya bagaimana melakukannya ....

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 
Palsu
sumber
Ini adalah pertanyaan yang sangat lama, tetapi masih sangat relevan dengan pengkodean MVC saat ini. Ada masalah dengan dua solusi yang diberikan sejauh ini, jadi saya telah menambahkan jawaban yang lebih rinci yang mencakup semua 3 opsi yang tersedia untuk Anda.
Gone Coding

Jawaban:

161

Anda dapat menghias properti model tampilan Anda dengan [DisplayName]atribut dan menentukan teks yang akan digunakan:

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

Atau gunakan kelebihan lain dari pembantu LabelFor yang memungkinkan Anda menentukan teks:

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

Dan, tidak, Anda tidak dapat menentukan nama kelas di MVC3 seperti yang Anda coba lakukan, karena LabelForhelper tidak mendukungnya. Namun, ini akan berfungsi di MVC4 atau 5.

Darin Dimitrov
sumber
@ raj2sekar1, apakah itu bekerja dan jawaban ini membantu Anda memecahkan masalah Anda sedang Anda harus mempertimbangkan menandai sebagai jawaban dengan mengklik centang di sebelahnya: meta.stackexchange.com/questions/5234/...
Darin Dimitrov
8
Anda perlu menggunakan System.ComponentModel.
yancyn
2
Ini bermanfaat, terima kasih. Tetapi saya pikir jawaban Anda akan lebih baik jika Anda memiliki ini@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me
2
Mungkin ini ditulis beberapa waktu yang lalu, tetapi sekarang Anda dapat menentukan nama kelas di dalam LabelFor: misalnya @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170
3
Tetapi jika Anda memperbarui database, kelas model dibuat ulang dan Anda kehilangan ini. Bagaimana Anda menghindarinya?
shim
30

Ini adalah pertanyaan lama, tetapi jawaban yang ada mengabaikan masalah serius membuang atribut khusus apa pun saat Anda membuat ulang model. Saya menambahkan jawaban yang lebih rinci untuk mencakup opsi saat ini yang tersedia.

Anda memiliki 3 pilihan:

  • Tambahkan [DisplayName("Name goes here")]atribut ke kelas model data. Sisi negatifnya adalah ini dibuang setiap kali Anda membuat ulang model data.
  • Tambahkan parameter string ke Anda Html.LabelFor. Misalnya @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})Referensi: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx Kelemahannya adalah Anda harus mengulang label di setiap tampilan.
  • Opsi ketiga. Gunakan kelas meta-data yang dilampirkan ke kelas data (ikuti detailnya).

Opsi 3 - Tambahkan Kelas Meta-Data:

Microsoft mengizinkan untuk mendekorasi properti pada kelas Entity Framework, tanpa mengubah kelas yang ada ! Ini dengan memiliki kelas meta-data yang dilampirkan ke kelas basis data Anda (secara efektif merupakan perpanjangan dari kelas EF Anda). Ini memungkinkan atribut ditambahkan ke kelas terkait dan bukan ke kelas itu sendiri sehingga perubahan tidak hilang saat Anda membuat ulang model data .

Misalnya, jika kelas data Anda MyModeldengan SomekingStatusproperti, Anda dapat melakukannya seperti ini:

Pertama-tama deklarasikan kelas parsial dengan nama yang sama (dan menggunakan namespace yang sama), yang memungkinkan Anda menambahkan atribut kelas tanpa diganti:

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

Semua kelas model data yang dihasilkan adalah kelas parsial, yang memungkinkan Anda untuk menambahkan properti dan metode tambahan hanya dengan membuat lebih banyak kelas dengan nama yang sama (ini sangat berguna dan saya sering menggunakannya misalnya untuk menyediakan versi string yang diformat dari jenis bidang lain dalam model ).

Langkah 2: Tambahkan kelas metatadata yang direferensikan oleh kelas parsial baru Anda:

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

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

Catatan:

  • Dari memori, jika Anda mulai menggunakan kelas metadata, itu mungkin mengabaikan atribut yang ada pada kelas sebenarnya ( [required]dll) sehingga Anda mungkin perlu menduplikasi atribut yang ada di kelas Meta-data.
  • Ini tidak beroperasi dengan sihir dan tidak akan bekerja dengan kelas apapun. Kode yang mencari atribut dekorasi UI dirancang untuk mencari kelas meta-data terlebih dahulu.
Hilang Coding
sumber
Apakah ada alasan mengapa ini tidak berfungsi di ASP.NET Core 3.1? [Wajib] berfungsi, tetapi tidak [DisplayName ("label saya")]
John Pasquet
15

Anda dapat mengubah teks label dengan menghiasi properti dengan DisplayNameatribut.

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

Atau, Anda dapat menulis HTML mentah secara eksplisit:

<label for="SomekingStatus" class="control-label">Someking Status</label>
xandercoded
sumber
1
@shim: Anda seharusnya tidak bekerja langsung dengan kelas model database / domain dalam tampilan Anda, biasanya akan ada kelas 'model tampilan' perantara di antaranya.
Vman
persis apa yang saya cari menggunakan sintaks label .. Terima kasih @xander
Asif Iqbal
1
Masalah dengan "menulis HTML mentah secara eksplisit", adalah Anda harus menulis label sendiri setiap kali Anda menggunakan formulir itu. Akan lebih baik untuk mendeklarasikan de DisplayName pada model.
César León
4

Hiasi properti model dengan atribut DisplayName.

Teppic
sumber
1

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

Anurag
sumber