сегодня я запутался, когда делал пару <%=Html.LabelFor(m=>m.MyProperty)%>
в ASP.NET MVC 2 и использовал атрибут [DisplayName("Show this instead of MyProperty")]
из System.ComponentModel
.
Как оказалось, когда я помещал атрибут в переопределенное свойство, LabelFor, похоже, не замечал этого.
Однако атрибут [Required]
отлично работает с переопределенным свойством, и сгенерированное сообщение об ошибке фактически использует атрибут DisplayNameAttribute.
Это некоторый тривиальный пример кода, более реалистичный сценарий состоит в том, что у меня есть модель базы данных, отдельная от модели представления, но для удобства я бы хотел наследовать от модели базы данных, добавить свойства только для просмотра и украсить модель представления с помощью атрибутов. для пользовательского интерфейса.
public class POCOWithoutDataAnnotations
{
public virtual string PleaseOverrideMe { get; set; }
}
public class EditModel : POCOWithoutDataAnnotations
{
[Required]
[DisplayName("This should be as label for please override me!")]
public override string PleaseOverrideMe
{
get { return base.PleaseOverrideMe; }
set { base.PleaseOverrideMe = value; }
}
[Required]
[DisplayName("This property exists only in EditModel")]
public string NonOverriddenProp { get; set; }
}
Сильно типизированный ViewPage<EditModel>
содержит:
<div class="editor-label">
<%= Html.LabelFor(model => model.PleaseOverrideMe) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.PleaseOverrideMe) %>
<%= Html.ValidationMessageFor(model => model.PleaseOverrideMe) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.NonOverriddenProp) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.NonOverriddenProp) %>
<%= Html.ValidationMessageFor(model => model.NonOverriddenProp) %>
</div>
Затем метки отображаются как «PleaseOverrideMe» ( не с использованием DisplayNameAttribute) и «Это свойство существует только в EditModel» ( с использованием атрибут DisplayNameAttribute) при просмотре страницы.
Если я отправляю сообщения с пустыми значениями, запускаю проверку с помощью ActionMethod:
[HttpPost]
public ActionResult Edit(EditModel model)
{
if (!ModelState.IsValid)
return View(model);
return View("Thanks");
}
<%= Html.ValidationMessageFor(model => model.PleaseOverrideMe) %>
на самом деле использует атрибут [DisplayName("This should be as label for please override me!")]
и выдает текст ошибки по умолчанию "Это поле должно быть как метка для поля" Пожалуйста, переопределите меня! "Обязательно."
Может ли какая-нибудь дружелюбная душа пролить свет на это?