oggi mi sono confuso quando eseguo un paio di <%=Html.LabelFor(m=>m.MyProperty)%>
in ASP.NET MVC 2 e utilizzando l'attributo [DisplayName("Show this instead of MyProperty")]
da System.ComponentModel
.Si chiede perché l'attributo DisplayName viene ignorato in LabelFor su una proprietà sostituita
Come si è scoperto, quando ho messo l'attributo su una proprietà sovrascritta, LabelFor non sembra averlo notato.
Tuttavia, l'attributo [Required]
funziona correttamente sulla proprietà sottoposta a override e il messaggio generato generico utilizza effettivamente DisplayNameAttribute.
Questo è un po 'examplecode banale, lo scenario più realistico è che ho un databasemodel separato dal ViewModel, ma per comodità, mi piacerebbe ereditare dalla databasemodel, aggiungere solo visualizzazione proprietà e decorare il ViewModel con la attributi per l'interfaccia utente.
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; }
}
Il fortemente tipizzato ViewPage<EditModel>
contiene:
<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>
Le etichette vengono quindi visualizzati come "PleaseOverrideMe" (non utilizzando il DisplayNameAttribute) e "Questa struttura esiste solo in EditModel" (utilizzando DisplayNameAttribute) durante la visualizzazione della pagina.
Se pubblico con valori vuoti, innescando la convalida con questo ActionMethod:
[HttpPost]
public ActionResult Edit(EditModel model)
{
if (!ModelState.IsValid)
return View(model);
return View("Thanks");
}
il <%= Html.ValidationMessageFor(model => model.PleaseOverrideMe) %>
utilizza effettivamente [DisplayName("This should be as label for please override me!")]
attributo, e produce il default ErrorText "The Questa dovrebbe essere come etichetta per favore mi ignorare campo è! necessario."
Qualche anima amica farebbe luce su questo?
Lasse, hai avuto fortuna nel frattempo? –
Se si utilizza la riflessione per visualizzare tutte le proprietà, è disponibile il tipo 'ModelMetadata'. Essenzialmente si farebbe questo 'Html.Label (prop.GetDisplayName())'. –