Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在MVC4中使用IMetadataAware显示ShowForDisplay/ShowForEdit的问题_Asp.net Mvc_Asp.net Mvc 4_Razor_Data Annotations - Fatal编程技术网

Asp.net mvc 在MVC4中使用IMetadataAware显示ShowForDisplay/ShowForEdit的问题

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

我有一个viewmodel,需要创建一种方法来隐藏视图模型的某些属性,以防显示或编辑。我正在尝试实现一个自定义属性,该属性实现了。我的简单实现基于以下问题中的示例:

给定以下视图模型

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()帮助程序时工作正常

如果只需要使用这些帮助器来创建视图,则自定义属性的行为将与预期的方式相同