2013-10-29 49 views
0

我有一個視圖模型,需要創建一種方法來隱藏視圖模型的某些屬性來顯示或編輯。我試圖實現一個實現IMetadataAware的自定義屬性。我從實例立足我簡單的實現在下面的SO問題:MVC4中使用IMetadataAware的ShowForDisplay/ShowForEdit問題

考慮下面的視圖模型

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中執行此操作的一種可接受方式。

在此先感謝

回答

0

這是舊的,但今天仍然有用(MVC 5.2.2)。我一直在尋找和探索爲什麼發生這種情況,我可以分享我迄今爲止發現的內容。

它似乎沒有與EditorFor和DisplayFor助手一起工作,仍然在調查爲什麼這是,但它肯定是一個錯誤,因爲它使用EditorForModel()和DisplayForModel()助手時可以正常工作。

如果您只需要使用這些幫助程序來創建視圖,那麼您的自定義屬性將按照預期方式運行。