Вы можете написать собственный поставщик метаданных и установить свойство метаданных 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;
}
}
, затем зарегистрируйте этого провайдера в Application_Start
:
ModelMetadataProviders.Current = new MyModelMetadataProvider();
и, наконец, украсить:
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()
, свойство Prop1
не будет включено в шаблон редактора.
Примечание: вы можете сделать то же самое со свойством метаданных ShowForDisplay
.