1

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

给定以下视图模型

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

提前致谢

4

1 回答 1

1

这是旧的,但今天仍然适用(MVC 5.2.2)。我一直在寻找和探索为什么会发生这种情况,我可以分享我到目前为止的发现。

它似乎不适用于 EditorFor 和 DisplayFor 助手,仍在调查为什么会这样,但这绝对是一个错误,因为它在使用 EditorForModel() 和 DisplayForModel() 助手时工作正常。

如果您只需要使用这些助手来创建您的视图,您的自定义属性将按照预期的方式运行。

于 2014-09-24T00:30:53.927 回答