在做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