Asp.net mvc 在MVC4中使用IMetadataAware显示ShowForDisplay/ShowForEdit的问题
我有一个viewmodel,需要创建一种方法来隐藏视图模型的某些属性,以防显示或编辑。我正在尝试实现一个自定义属性,该属性实现了。我的简单实现基于以下问题中的示例:Asp.net mvc 在MVC4中使用IMetadataAware显示ShowForDisplay/ShowForEdit的问题,asp.net-mvc,asp.net-mvc-4,razor,data-annotations,Asp.net Mvc,Asp.net Mvc 4,Razor,Data Annotations,我有一个viewmodel,需要创建一种方法来隐藏视图模型的某些属性,以防显示或编辑。我正在尝试实现一个自定义属性,该属性实现了。我的简单实现基于以下问题中的示例: 给定以下视图模型 public class ProductViewModel { [PreventRendering] public string Name { get; set; } public string Description { get; set; } public DateT
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的实例返回到视图。该视图是使用默认的VisualStudio“添加视图”行为生成的,对于该行为,我选择使用ProductViewModel强类型,并将Edit指定为脚手架
视图使用以下行显示视图模型名称的内容:
<div >
@Html.DisplayFor(model => model.Name)
</div>
<div >
@Html.EditorFor(model => model.Name)
</div>
@DisplayFor(model=>model.Name)
@EditorFor(model=>model.Name)
尽管使用PreventRendering属性修饰Name属性,但Name属性在视图中仍显示为可编辑和不可编辑。由于自定义属性实现IMetadataAware并将ShowForDisplay和ShowForEdit都设置为false,为什么视图中仍呈现Name属性?我对文档的理解是,该属性提供了额外的元数据,以防止在显示和编辑(使用stock Razor语法时)中呈现Name属性。以这种方式使用自定义属性,我缺少什么
最终,我需要能够根据情况呈现视图模型的不同属性,并且使用实现IMetadataAware的自定义属性(同样,基于文档)似乎是在MVC4中实现这一点的一种可接受的方法
提前感谢这已经很老了,但今天仍然适用(MVC 5.2.2)。我一直在寻找和探索为什么会发生这种情况,我可以分享我迄今为止的发现 它似乎不适用于EditorFor和DisplayFor帮助程序,仍在研究原因,但它肯定是一个bug,因为它在使用EditorForModel()和DisplayForModel()帮助程序时工作正常
如果您只需要使用这些帮助程序来创建视图,则自定义属性的行为将与预期的一致。这是一个古老的功能,但在今天仍然适用(MVC 5.2.2)。我一直在寻找和探索为什么会发生这种情况,我可以分享我迄今为止的发现 它似乎不适用于EditorFor和DisplayFor帮助程序,仍在研究原因,但它肯定是一个bug,因为它在使用EditorForModel()和DisplayForModel()帮助程序时工作正常 如果只需要使用这些帮助器来创建视图,则自定义属性的行为将与预期的方式相同