Мне нужно более общее решение, поэтому я создал новый атрибут:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class RenderModeAttribute : Attribute
{
public RenderMode RenderMode { get; set; }
public RenderModeAttribute(RenderMode renderMode)
{
RenderMode = renderMode;
}
}
public enum RenderMode
{
Any,
EditModeOnly,
DisplayModeOnly
}
И включил следующий код в мои пользовательские DataAnnotationsModelMetadataProvider:
var renderModeAttribute = attributes.OfType<RenderModeAttribute>();
if (renderModeAttribute.Any())
{
var renderMode = renderModeAttribute.First().RenderMode;
switch (renderMode)
{
case RenderMode.DisplayModeOnly:
metadata.ShowForDisplay = true;
metadata.ShowForEdit = false;
break;
case RenderMode.EditModeOnly:
metadata.ShowForDisplay = false;
metadata.ShowForEdit = true;
break;
}
}
Чтобы я мог просто украсить свою модель так:
public class DepartmentViewModel
{
[RenderMode(RenderMode.EditModeOnly)]
public int StateId { get; set; }
[RenderMode(RenderMode.DisplayModeOnly)]
public string StateName { get; set; }
}