Mvc3'te jilet içinde LabelFor için görünen adı nasıl değiştirebilirim?


87

Jilet motorunda LabelForadı görüntülemek için yardımcı yöntem kullandım

Ancak görünen adın görüntülenmesi iyi görünmüyor. bu yüzden görünen adımı nasıl yapacağımı değiştirmem gerekiyor ...

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

Bu çok eski bir sorudur, ancak yine de mevcut MVC kodlamasıyla çok ilgilidir. Şimdiye kadar sağlanan iki çözümle ilgili sorunlar var, bu nedenle size sunulan 3 seçeneğin tümünü kapsayan daha ayrıntılı bir yanıt ekledim .
Kodlama Gone

Yanıtlar:


161

Görünüm modeli özelliğinizi [DisplayName]öznitelikle dekore edebilir ve kullanılacak metni belirtebilirsiniz:

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

Veya, metni belirtmenize izin veren LabelFor yardımcısının başka bir aşırı yüklemesini kullanın:

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

Ve hayır, yapmaya çalıştığınız gibi MVC3'te bir sınıf adı belirtemezsiniz, çünkü LabelForyardımcı bunu desteklemiyor. Ancak, bu MVC4 veya 5'te çalışır.


@ raj2sekar1, eğer işe yarıyorsa ve bu cevap yaşadığınız sorunu çözmenize yardımcı oluyorsa, yanındaki tik işaretine tıklayarak yanıt olarak işaretlemeyi düşünmelisiniz: meta.stackexchange.com/questions/5234/…
Darin Dimitrov

8
Yine de System.ComponentModel kullanmanız gerekir.
yancyn

2
Bu faydalı oldu, teşekkürler. Ama bence onun yerine buna sahip olsaydın cevabın daha iyi olurdu@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
Belki bu bir süre önce yazılmıştır, ancak şimdi LabelFor içinde sınıf adını belirtebilirsiniz: ör. @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
Ancak veritabanını güncellerseniz, model sınıfları yeniden oluşturulur ve bunu kaybedersiniz. Bundan nasıl kaçınıyorsunuz?
şim

30

Bu eski bir soruydu, ancak mevcut yanıtlar, modeli yeniden oluşturduğunuzda herhangi bir özel özniteliği atma gibi ciddi sorunu görmezden geliyor. Mevcut seçenekleri kapsayacak şekilde daha ayrıntılı bir cevap ekliyorum.

3 seçeneğiniz var:

  • [DisplayName("Name goes here")]Veri modeli sınıfına bir öznitelik ekleyin . Dezavantajı, veri modellerini her yeniden oluşturduğunuzda bunun bir kenara atılmasıdır.
  • Sizin Html.LabelFor. örneğin @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})Referans: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx Bunun dezavantajı, etiketi tekrarlamanız gerektiğidir her açıdan.
  • Üçüncü seçenek. Veri sınıfına eklenmiş bir meta veri sınıfı kullanın (ayrıntılar aşağıdadır).

Seçenek 3 - Bir Meta Veri Sınıfı Ekleme:

Microsoft , var olan sınıfı değiştirmeden bir Entity Framework sınıfındaki özelliklerin dekorasyonuna izin verir ! Bu, veritabanı sınıflarınıza eklenen meta veri sınıflarına sahip olarak (etkili bir şekilde EF sınıfınızın yanlara doğru bir uzantısıdır). Bu, özniteliklerin sınıfın kendisine değil ilişkili sınıfa eklenmesine izin verir , böylece veri modellerini yeniden oluşturduğunuzda değişiklikler kaybolmaz .

Örneğin, veri sınıfınız MyModelbir SomekingStatusözelliğe sahipse , bunu şu şekilde yapabilirsiniz:

Önce , aynı ada sahip (ve aynı ad alanını kullanarak) kısmi bir sınıf bildirin; bu, geçersiz kılınmadan bir sınıf özelliği eklemenize olanak tanır:

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

Oluşturulan tüm veri modeli sınıfları, yalnızca aynı adda daha fazla sınıf oluşturarak fazladan özellikler ve yöntemler eklemenize izin veren kısmi sınıflardır (bu çok kullanışlıdır ve genellikle bunu, örneğin modeldeki diğer alan türlerinin biçimlendirilmiş dize sürümlerini sağlamak için kullanırım. ).

Adım 2: Yeni kısmi sınıfınız tarafından referans verilen bir meta veri sınıfı ekleyin:

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

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

Notlar:

  • Bellekten, bir meta veri sınıfı kullanmaya başlarsanız, gerçek sınıf ( [required]vb.) Üzerindeki mevcut öznitelikleri yok sayabilir, bu nedenle Meta-veri sınıfındakileri çoğaltmanız gerekebilir.
  • Bu sihirle çalışmaz ve sadece herhangi bir sınıfla çalışmaz. UI dekorasyon özniteliklerini arayan kod, önce bir meta-veri sınıfını aramak için tasarlanmıştır.

Bunun ASP.NET Core 3.1'de çalışmamasının herhangi bir nedeni var mı? [Zorunlu] çalışıyor, ancak [DisplayName ("etiketim")] çalışmıyor
John Pasquet

15

Özelliği özellik ile süsleyerek etiketlerin metnini değiştirebilirsiniz DisplayName.

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

Veya ham HTML'yi açıkça yazabilirsiniz:

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

1
@shim: Görünümlerinizde veritabanı / alan modeli sınıflarıyla gerçekten doğrudan çalışmamalısınız, genellikle arada bir ara 'görünüm modeli' sınıfı olur.
Vman

tam olarak etiket sözdizimini kullanarak aradığım şey..Teşekkürler @xander
Asif Iqbal

1
"Ham HTML'yi açıkça yazın" ile ilgili sorun, bu formu her kullandığınızda etiketi kendiniz yazmanız gerekmesidir. Model üzerinde de DisplayName belirtmek daha iyi olacaktır.
César León

4

Model özelliğini DisplayName özniteliğiyle dekore edin.


1

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.