Как изменить отображаемое имя для LabelFor в razor в mvc3?

87

В движке бритвы я использовал LabelForвспомогательный метод для отображения имени

Но отображаемое имя кажется не очень удобным для отображения. поэтому мне нужно изменить отображаемое имя, как это сделать ....

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 
Притворство
источник
Это очень старый вопрос, но он все еще очень актуален для текущего кодирования MVC. На данный момент есть проблемы с двумя предоставленными решениями, поэтому я добавил более подробный ответ, охватывающий все 3 доступных вам варианта.
Gone Coding

Ответы:

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
Но если вы обновите базу данных, классы модели будут восстановлены, и вы потеряете это. Как этого избежать?
shim
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>
xandercoded
источник
1
@shim: На самом деле вам не следует напрямую работать с классами модели базы данных / домена в ваших представлениях, обычно между ними будет промежуточный класс модели представления.
Vman
именно то, что я искал, используя синтаксис меток .. Спасибо @xander
Асиф Икбал
1
Проблема с «явным написанием необработанного HTML» заключается в том, что вам придется писать метку самостоятельно каждый раз, когда вы используете эту форму. Было бы лучше объявить de DisplayName на модели.
Сезар Леон,
4

Украсьте свойство модели атрибутом DisplayName.

Теплый
источник
1

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

Анураг
источник