我有一个视图模型,需要创建一种方法来隐藏视图模型的某些属性以防止显示或编辑。我正在尝试实现一个实现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 对其进行强类型化,并将 Edit 指定为脚手架。
视图使用以下行显示视图模型名称的内容:
<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 中执行此操作的一种可接受的方式。
提前致谢