在做ASP.NET MVC 2几个<%=Html.LabelFor(m=>m.MyProperty)%>
和使用[DisplayName("Show this instead of MyProperty")]
属性从System.ComponentModel
当我弄糊涂了。奇怪,为什么displayName属性为LabelFor忽略上覆盖的属性今天
事实证明,当我将属性放在重写的属性上时,LabelFor似乎没有注意到它。
但是,[Required]
属性对重写的属性正常工作,生成的errormessage实际上使用DisplayNameAttribute。
这是一些简单的示例代码,更现实的情况是我有一个databasemodel独立于viewmodel,但为了方便起见,我想继承databasemodel,添加View-only属性并装饰ViewModel用户界面的属性。
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 的”这应该是作为标签,请忽略我的场!需要。”
一些友善的灵魂会对此有所了解吗?
拉塞,你不得不在此期间任何运气? – 2010-09-02 13:31:27
如果您使用反射来显示所有属性,则可以使用“ModelMetadata”类型。基本上你会这样做'Html.Label(prop.GetDisplayName())'。 – 2013-08-27 20:58:53