dziś wprawiłam się w zakłopotanie, robiąc kilka <%=Html.LabelFor(m=>m.MyProperty)%>
w ASP.NET MVC 2 i używając atrybutu [DisplayName("Show this instead of MyProperty")]
z System.ComponentModel
.Zastanawiasz się, dlaczego atrybut DisplayName jest ignorowany w LabelFor na nadpisanej właściwości
Jak się okazało, kiedy umieściłem atrybut na przesłoniętej właściwości, LabelFor najwyraźniej go nie zauważył.
Jednak atrybut [Required]
działa poprawnie na przesłanianej właściwości, a wygenerowany błąd automatycznie używa DisplayNameAttribute.
To jest trywialny kod przykładowy, bardziej realistycznym scenariuszem jest to, że mam model bazy danych oddzielony od viewmodelu, ale dla wygody chciałbym dziedziczyć z modelu bazy danych, dodawać właściwości tylko do widoku i dekorować model widoku za pomocą atrybuty interfejsu użytkownika.
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; }
}
silnie typami ViewPage<EditModel>
zawiera:
<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>
Etykiety są wtedy wyświetlane jako "PleaseOverrideMe" (nie używając DisplayNameAttribute) i "Ta właściwość istnieje tylko w EditModel" (przy użyciu the DisplayNameAttribute) podczas przeglądania strony.
Gdybym rozpoczynać z pustych wartości, wyzwalanie walidacji z tym ActionMethod:
[HttpPost]
public ActionResult Edit(EditModel model)
{
if (!ModelState.IsValid)
return View(model);
return View("Thanks");
}
<%= Html.ValidationMessageFor(model => model.PleaseOverrideMe) %>
faktycznie używa [DisplayName("This should be as label for please override me!")]
atrybut i tworzy domyślny errortext „The ta powinna być jak etykieta na prosimy przesłonić mi pole jest! wymagany."
Czy jakaś przyjazna dusza rzuci trochę światła na to?
Lasse, miałeś szczęścia w międzyczasie? –
Jeśli używasz refleksji do wyświetlania wszystkich twoich właściwości, masz dostęp do typu 'ModelMetadata'. Zasadniczo zrobiłbyś to 'Html.Label (prop.GetDisplayName())'. –