ビューモデルがあり、ビュー モデルの特定のプロパティを表示または編集から非表示にする手段を作成する必要があります。IMetadataAwareを実装するカスタム属性を実装しようとしています。私は、次の SO の質問の例に基づいて簡単な実装を行っています。
- MVC 3: EditorForModel を使用して ID プロパティを非表示にする
- IMetadataAware 属性を同じフィールドで複数回使用できますか?
- 条件に基づいてデータ注釈を含むビュー モデル要素を表示/非表示にすることはできますか?
- ASP.NET MVC: 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 で厳密に型指定することを選択し、編集を足場として指定しました。
ビューには、次の行を使用してビュー モデルの名前の内容が表示されます。
<div >
@Html.DisplayFor(model => model.Name)
</div>
<div >
@Html.EditorFor(model => model.Name)
</div>
Name プロパティが PreventRendering 属性で修飾されているにもかかわらず、Name プロパティはビューで編集可能および編集不可の両方として表示されます。カスタム属性は IMetadataAware を実装し、ShowForDisplay と ShowForEdit の両方を false に設定するため、Name プロパティがまだビューに表示されるのはなぜですか? ドキュメントを読んだところ、この属性は、表示および編集のために Name プロパティがレンダリングされないようにするための追加のメタデータを提供します (ストック Razor 構文を使用する場合)。この方法でカスタム属性を使用することに関して何が欠けていますか?
最終的には、状況に応じてビュー モデルのさまざまなプロパティをレンダリングできるようにする必要があり、IMetadataAware を実装するカスタム属性を使用することは (ドキュメントに基づくと)、MVC4 でこれを行うための 1 つの許容可能な方法のようです。
前もって感謝します