У меня есть viewmodel, который имеет int StateID
поле и a string StateName
поле как так:
public class DepartmentViewModel : BaseViewModel, IModelWithId
{
// only show in edit mode
public int StateId { get; set; }
// only show in display mode
public string StateName { get; set; }
}
У меня есть представление только для чтения, которое использует DisplayForModel
и представление обновления, которое использует EditorForModel
. Я хочу DisplayForModel
просмотрите для показа StateName
свойство, и EditorForModel
просмотрите используют StateID
свойство (я на самом деле представляю dropdownlist на основе этого).
Я не смог выяснить, как украсить мои viewmodel свойства для создания этого поведения.
Я хотел найти более универсальное решение, поэтому я создал новый атрибут:
[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; }
}
Переопределите шаблоны:
В ~/Shared/EditorTemplates/DepartmentViewModel.ascx
поставьте:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Namespace.DepartmentViewModel>" %>
<%= Html.LabelFor(x => x.StateId) %>
<%= Html.TextBoxFor(x => x.StateId) %>
А в вашем ~/Shared/DisplayTemplates/DepartmentViewModel. ascx
:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Namespace.DepartmentViewModel>" %>
<div><%= Html.Encode(Model.StateName) %></div>