Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 3 如何从@Html.EditForModel()中排除字段,但使用Html.DisplayForModel()显示该字段_Asp.net Mvc 3_Display Templates - Fatal编程技术网

Asp.net mvc 3 如何从@Html.EditForModel()中排除字段,但使用Html.DisplayForModel()显示该字段

Asp.net mvc 3 如何从@Html.EditForModel()中排除字段,但使用Html.DisplayForModel()显示该字段,asp.net-mvc-3,display-templates,Asp.net Mvc 3,Display Templates,我正在阅读ASP.NETMVC及其所有有趣的用途,我刚刚发现了 在我急于测试这件事的过程中,我将一个简单的模型转换为使用@Html.DisplayForModel()和@Html.EditForModel(),它就像一个幸运符一样工作:) 但是,我立即发现,我无法轻松定义一个字段以显示在显示视图上,但根本不用于编辑…您可以编写一个自定义元数据提供程序并设置ShowForEdit元数据属性。因此,从自定义属性开始: public class ShowForEditAttribute : Attri

我正在阅读ASP.NETMVC及其所有有趣的用途,我刚刚发现了

在我急于测试这件事的过程中,我将一个简单的模型转换为使用
@Html.DisplayForModel()
@Html.EditForModel()
,它就像一个幸运符一样工作:)


但是,我立即发现,我无法轻松定义一个字段以显示在显示视图上,但根本不用于编辑…

您可以编写一个自定义元数据提供程序并设置
ShowForEdit
元数据属性。因此,从自定义属性开始:

public class ShowForEditAttribute : Attribute
{
    public ShowForEditAttribute(bool show)
    {
        Show = show;
    }

    public bool Show { get; private set; }
}
然后是自定义模型元数据提供程序:

public class MyModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(
        IEnumerable<Attribute> attributes,
        Type containerType, 
        Func<object> modelAccessor, 
        Type modelType, 
        string propertyName
    )
    {
        var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
        var sfea = attributes.OfType<ShowForEditAttribute>().FirstOrDefault();
        if (sfea != null)
        {
            metadata.ShowForEdit = sfea.Show;
        }
        return metadata;
    }
}
最后装饰:

public class MyViewModel
{
    [ShowForEdit(false)]
    public string Prop1 { get; set; }

    public string Prop2 { get; set; }
}
现在,如果您认为您有:

@model MyViewModel

<h2>Editor</h2>
@Html.EditorForModel()

<h2>Display</h2>
@Html.DisplayForModel()
@model MyViewModel
编辑
@Html.EditorForModel()
展示
@Html.DisplayForModel()
编辑器模板中将不包括
Prop1
属性


备注:您可以使用
ShowForDisplay
元数据属性执行相同操作。

是否可以使用Html.DisplayTextbox或其他选项显示所需的每个字段?这样,您还可以自定义引用该字段的外观和标签。

您可以使用IMetadataAware接口创建属性,该属性将在元数据中设置ShowForEdit和ShowForDislay:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TemplatesVisibilityAttribute : Attribute, IMetadataAware
{
    public bool ShowForDisplay { get; set; }

    public bool ShowForEdit { get; set; }

    public TemplatesVisibilityAttribut()
    {
        this.ShowForDisplay = true;
        this.ShowForEdit = true;
    }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        if (metadata == null)
        {
            throw new ArgumentNullException("metadata");
        }

        metadata.ShowForDisplay = this.ShowForDisplay;
        metadata.ShowForEdit = this.ShowForEdit;
    }

}
然后,您可以将其附着到您的财产,如下所示:

public class TemplateViewModel
{
  [TemplatesVisibility(ShowForEdit = false)]
  public string ShowForDisplayProperty { get; set; }

  public string ShowAlwaysProperty { get; set; }
}

这就是您所需要的。

非常优雅:)明天早上我会首先尝试一下。我认为tpeczek提出的解决方案更优雅。实际上,这将完全破坏使用DisplayForModel和EditForModel方法的全部意义。。。
public class TemplateViewModel
{
  [TemplatesVisibility(ShowForEdit = false)]
  public string ShowForDisplayProperty { get; set; }

  public string ShowAlwaysProperty { get; set; }
}