ModelMetadata: свойство ShowForEdit не работает

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

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
}

С этим на месте, попробуйте еще раз и посмотрите, поможет ли это.

Другие вопросы по тегам