【问题标题】:ModelMetadata: ShowForEdit property not appearing to workModelMetadata:ShowForEdit 属性似乎不起作用
【发布时间】:2013-04-17 19:11:56
【问题描述】:

Iv 编写了如下所示的 MetaDataProvider,并将其与编辑器模板结合使用。 DisplayName 工作正常,但由于某种原因 ShowForEdit 值没有任何效果。有什么想法吗?

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);          I

            metadata.DisplayName = "test";

            metadata.ShowForEdit = false;
            metadata.ShowForDisplay = false;
            metadata.HideSurroundingHtml = true;

            return metadata;
        }
}

【问题讨论】:

    标签: asp.net-mvc metadata data-annotations modelmetadata


    【解决方案1】:

    这似乎类似于问题Why can't I set ShowForEdit model metadata with an attribute?,所以我将在此处复制我的答案:

    您要应用它的属性类型是什么?如果我们使用 Reflector,我们可以发现 ShowForEdit 和 ShowForDisplay 属性用于以下函数:

    ShowForEdit: System.Web.Mvc.Html.DefaultEditorTemplates.ShouldShow(...)

    ShowForDisplay:System.Web.Mvc.Html.DefaultDisplayTemplates.ShouldShow(...)

    这些方法的定义是:

    private static bool ShouldShow(ModelMetadata metadata, TemplateInfo templateInfo)
    {
      return (((metadata.ShowForEdit && (metadata.ModelType != typeof(EntityState))) && !metadata.IsComplexType) && !templateInfo.Visited(metadata));
    }
    
    private static bool ShouldShow(ModelMetadata metadata, TemplateInfo templateInfo)
    {
      return (((metadata.ShowForDisplay && (metadata.ModelType != typeof(EntityState))) && !metadata.IsComplexType) && !templateInfo.Visited(metadata));
    }
    

    忽略明显的属性检查(metadata.ShowForX),你可以看到它正在检查模型是否是EntityState的实例(可能不是),然后检查metadata.IsComplexType。

    我们可以在这里查看 IsComplexType 属性:

    public virtual bool IsComplexType
    {
      get
      {
        return !TypeDescriptor.GetConverter(this.ModelType).CanConvertFrom(typeof(string));
      }
    }
    

    也就是说,如果模型不能从字符串转换,它会返回 true,并且在 ShouldShow() 方法中,它会显示它是否不是复杂类型,即值可以从一个字符串。

    您需要做的是创建一个可以将字符串转换为模型的 TypeConverter,例如:

    一个模型:

    [TypeConverter(typeof(ItemConverter))]
    public class Item 
    {
      #region Properties
      public string Text { get; set; }
      #endregion
    }
    

    还有一个转换器:

    public class ItemConverter : TypeConverter
    {
      #region Methods
      public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
      {
        if (sourceType == typeof(string))
          return true;
    
        return base.CanConvertFrom(context, sourceType);
      }
    
      public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
      {
        if (value.GetType() == typeof(string)) 
        {
          return new Item { Text = (string)value };
        }
    
        return base.ConvertFrom(context, culture, value);
      }
      #endregion
    }
    

    设置好之后,再试一次,看看是否有帮助。

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 2010-10-08
      • 2010-11-16
      • 2010-12-08
      • 2013-07-31
      • 1970-01-01
      • 2015-10-05
      • 2014-02-24
      • 2021-09-12
      相关资源
      最近更新 更多