Як змінити відображуване ім'я для LabelFor у бритві в mvc3?


87

У движку бритви я використовував LabelForдопоміжний метод для відображення імені

Але відображуване ім'я, здається, не добре відображати. тому мені потрібно змінити своє відображуване ім’я, як це зробити ....

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

Це дуже давнє запитання, але все ще дуже актуальне для поточного кодування MVC. Наразі існують проблеми з двома рішеннями, тому я додав більш детальну відповідь, яка охоплює всі 3 доступні для вас варіанти.
Пропало кодування

Відповіді:


160

Ви можете прикрасити властивість моделі подання [DisplayName]атрибутом і вказати текст, який використовуватиметься:

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

Або скористайтеся іншим перевантаженням помічника LabelFor, який дозволяє вказати текст:

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

Ні, ви не можете вказати ім'я класу в MVC3, як ви намагалися зробити, оскільки LabelForпомічник цього не підтримує. Однак це може працювати в MVC4 або 5.


@ raj2sekar1, якщо він працює, і ця відповідь допомогла вам вирішити проблему, яку ви мали, вам слід розглянути можливість позначити її як відповідь, натиснувши галочку поруч: meta.stackexchange.com/questions/5234/…
Дарін Димитров

8
Вам потрібно використовувати System.ComponentModel.
yancyn

2
Це було корисно, дякую. Але я думаю, що ваша відповідь була б кращою, якби ви це мали замість цього@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
Можливо, це було написано деякий час тому, але тепер ви можете вказати назву класу всередині LabelFor: наприклад, @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
Але якщо ви оновите базу даних, класи моделей відновлюються, і ви втрачаєте це. Як уникнути цього?
шим

30

Це було старе запитання, але існуючі відповіді ігнорують серйозну проблему викидання будь-яких спеціальних атрибутів під час регенерації моделі. Я додаю більш детальну відповідь, щоб висвітлити поточні доступні варіанти.

У вас є 3 варіанти:

  • Додайте [DisplayName("Name goes here")]атрибут до класу моделі даних. Недоліком є ​​те, що це викидається щоразу, коли ви регенеруєте моделі даних.
  • Додайте параметр рядка до вашого Html.LabelFor. наприклад, @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})посилання: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx Недоліком цього є те, що ви повинні повторити мітку в кожному погляді.
  • Третій варіант. Використовуйте клас метаданих, приєднаний до класу даних (подробиці далі).

Варіант 3 - Додайте клас метаданих:

Microsoft дозволяє прикрашати властивості класу Entity Framework, не змінюючи існуючий клас ! Це завдяки наявності класів метаданих, які приєднуються до класів бази даних (фактично розширення вашого класу EF збоку). Це дозволяє додавати атрибути до асоційованого класу, а не до самого класу, тому зміни не втрачаються при регенерації моделей даних .

Наприклад, якщо ваш клас даних MyModelз SomekingStatusвласністю, ви могли б зробити це в такий спосіб :

Спочатку оголосіть частковий клас з тим самим іменем (і використовуючи той самий простір імен), що дозволяє додавати атрибут класу без перевизначення:

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

Усі класи згенерованих моделей даних є частковими класами, що дозволяють додавати додаткові властивості та методи, просто створюючи більше класів з однаковим ім'ям (це дуже зручно, і я часто використовую його, наприклад, для надання відформатованих рядкових версій інших типів полів у моделі ).

Крок 2: Додайте клас метаданих, на який посилається ваш новий частковий клас:

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

Посилання: https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute(v=vs.110).aspx

Примітки:

  • З пам'яті, якщо ви починаєте використовувати клас метаданих, він може ігнорувати існуючі атрибути фактичного класу ( [required]і т.д.), тому вам може знадобитися продублювати їх у класі мета-даних.
  • Це не діє за допомогою магії і не буде працювати лише з будь-якими класами. Код, який шукає атрибути оформлення інтерфейсу, призначений для пошуку класу метаданих спочатку.

Чи є причина, чому це не спрацьовує в ASP.NET Core 3.1? [Обов’язково] працює, але не [DisplayName ("мітка")
Джон Паскет,

15

Ви можете змінити текст міток, прикрасивши властивість DisplayNameатрибутом.

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

Або ви можете явно написати сирий HTML:

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

1
@shim: Ви насправді не повинні працювати безпосередньо з класами моделі бази даних / домену у своїх поданнях, як правило, між ними буде посередницький клас "view-model".
Вман

саме те, що я шукав, використовуючи синтаксис міток ... Дякую @xander
Asif Iqbal

1
Проблема з "явним написанням вихідного HTML" полягає в тому, що вам доведеться писати ярлик самостійно кожного разу, коли ви використовуєте цю форму. Було б краще оголосити de DisplayName на моделі.
Сесар Леон


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.