代码之家  ›  专栏  ›  技术社区  ›  CodeGrue

显示EditorForModel中的不同字段与MVC2中的DisplayForModel模式

  •  10
  • CodeGrue  · 技术社区  · 16 年前

    int StateID 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 . 我想要那个 显示模式 StateName 财产,以及 编辑FORMODEL StateID

    4 回复  |  直到 16 年前
        1
  •  17
  •   Bridget the Midget    14 年前

    新属性将类似于:

    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public sealed class RenderModeAttribute : Attribute, IMetadataAware
    {
        public RenderMode RenderMode { get; set; }
    
        public RenderModeAttribute(RenderMode renderMode)
        {
            RenderMode = renderMode;
        }
    
        public void OnMetadataCreated(ModelMetadata metadata)
        {
            switch (RenderMode)
            {
                case RenderMode.DisplayModeOnly:
                    metadata.ShowForDisplay = true;
                    metadata.ShowForEdit = false;
                    break;
    
                case RenderMode.EditModeOnly:
                    metadata.ShowForDisplay = false;
                    metadata.ShowForEdit = true;
                    break;
    
                case RenderMode.None:
                    metadata.ShowForDisplay = false;
                    metadata.ShowForEdit = false;
                    break;
            }
        }
    }
    
    public enum RenderMode
    {
        Any,
        EditModeOnly,
        DisplayModeOnly
    }
    
        2
  •  14
  •   CodeGrue    16 年前

    我想要一个更通用的解决方案,所以我创建了一个新属性:

    [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; }     
    } 
    
        3
  •  1
  •   Rodrigo Juarez    15 年前

    public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
    {
        protected override ModelMetadata CreateMetadata(System.Collections.Generic.IEnumerable<System.Attribute> attributes, System.Type containerType, System.Func<object> modelAccessor, System.Type modelType, string propertyName)
        {
            var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
    
            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;
    
                    case RenderMode.None:
                        metadata.ShowForDisplay = false;
                        metadata.ShowForEdit = false;
                        break;
                }
            } 
    
            return metadata;
        }
    }
    
        4
  •  0
  •   Darin Dimitrov    16 年前

    覆盖模板:

    ~/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>