Asp.net mvc 3 如何从@Html.EditForModel()中排除字段,但使用Html.DisplayForModel()显示该字段
我正在阅读ASP.NETMVC及其所有有趣的用途,我刚刚发现了 在我急于测试这件事的过程中,我将一个简单的模型转换为使用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
@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; }
}