2

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;
        }
}
4

1 回答 1

1

这似乎类似于问题为什么我不能使用属性设置 ShowForEdit 模型元数据?,所以我将在这里复制我的答案:

您将其应用于哪种类型的房产?如果我们使用 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
}

有了它,再试一次,看看是否有帮助。

于 2010-06-10T12:29:42.330 回答