我有一個視圖模型,需要創建一種方法來隱藏視圖模型的某些屬性來顯示或編輯。我試圖實現一個實現IMetadataAware的自定義屬性。我從實例立足我簡單的實現在下面的SO問題:MVC4中使用IMetadataAware的ShowForDisplay/ShowForEdit問題
- MVC 3: Hide ID property using EditorForModel
- Can I use an IMetadataAware attribute multiple times on the same field?
- Can I show/hide a view model element with data annotations based on a condition?
- ASP.NET MVC: Why can't I set ShowForEdit model metadata with an attribute?
考慮下面的視圖模型
public class ProductViewModel
{
[PreventRendering]
public string Name { get; set; }
public string Description { get; set; }
public DateTime CreationDate { get; set; }
}
的量,PreventRendering屬性是:
[AttributeUsage(AttributeTargets.Property)]
public class PreventRenderingAttribute : Attribute, IMetadataAware
{
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.ShowForDisplay = false;
metadata.ShowForEdit = false;
}
}
我有一個簡單的控制器返回ProductViewModel的一個實例的圖。該視圖是使用默認的Visual Studio「添加視圖」行爲生成的,我選擇該行爲用ProductViewModel進行強類型化,並將Edit指定爲腳手架。
視圖使用下面的線條顯示視圖模型的名稱的內容:
<div >
@Html.DisplayFor(model => model.Name)
</div>
<div >
@Html.EditorFor(model => model.Name)
</div>
儘管Name屬性被裝飾與PreventRendering屬性,名稱屬性仍顯示爲兩個可編輯和不可編輯在視圖中。由於自定義屬性實現IMetadataAware並將ShowForDisplay和ShowForEdit都設置爲false,爲什麼Name屬性仍然在視圖中呈現?我對文檔的閱讀是該屬性提供了額外的元數據,以防止顯示和編輯中的Name屬性呈現(使用股票Razor語法時)。我以這種方式使用自定義屬性時缺少什麼?
最終,我需要能夠根據具體情況呈現視圖模型的不同屬性,並且使用實現IMetadataAware的自定義屬性似乎(再次,基於文檔)是在MVC4中執行此操作的一種可接受方式。
在此先感謝