Сегодня я запутался, когда делал пару <%=Html.LabelFor(m=>m.MyProperty)%>
в ASP.NET MVC 2 и использовал атрибут [DisplayName("Show this instead of MyProperty")]
из System.ComponentModel
.
Как оказалось, когда я помещал атрибут в переопределенное свойство, LabelFor, похоже, не заметил его.
Однако атрибут [Required]
отлично работает в переопределенном свойстве, и сгенерированный errormessage фактически использует DisplayNameAttribute.
Это какой-то тривиальный пример кода, более реалистичным сценарием является то, что у меня есть база данных данных отдельно от модели viewmodel, но для удобства я хотел бы наследовать из базы данных данных, добавлять свойства View-only и декорировать модель с атрибутами для пользовательского интерфейса.
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!")]
и создает по умолчанию errortext. "Это должно быть как метка для поля" пожалуйста, переопределите меня! ".
Может ли какая-нибудь дружеская душа пролить свет на это?