Поля Showing Different в EditorForModel по сравнению с режимами DisplayForModel в MVC2

У меня есть 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 свойства для создания этого поведения.

10
задан CodeGrue 2 June 2010 в 15:14
поделиться

2 ответа

Я хотел найти более универсальное решение, поэтому я создал новый атрибут:

[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; }     
} 
14
ответ дан 3 December 2019 в 14:43
поделиться

Переопределите шаблоны:

В ~/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>
0
ответ дан 3 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: