ModelMetadata: свойство ShowForEdit не работает - PullRequest
2 голосов
/ 02 июня 2010

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 Ответ

1 голос
/ 10 июня 2010

Это похоже на вопрос Почему я не могу установить метаданные модели 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 (вероятно, не является), а затем проверяет метаданные.

Мы можем посмотреть на свойство 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
}

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

...