2010-06-02 1 views
2

Iv написал MetaDataProvider, как показано ниже, и использую его вместе с шаблонами редактора. DisplayName работает правильно, но по какой-то причине значение ShowForEdit не оказывает никакого эффекта. Есть идеи?ModelMetadata: свойство 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; 
     } 
} 

ответ

2

Это, кажется, похож на вопрос Why can't I set ShowForEdit model metadata with an attribute?, так что я буду повторить мой ответ здесь:

Какой тип недвижимости вы подаете его? Если мы будем использовать отражатель, мы можем обнаружить, что 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), вы можете увидеть, что проверяя, является ли модель n intstance EntityState (возможно, нет), а затем проверка метаданных. IsComplexType.

Мы можем посмотреть на собственности IsComplexType здесь:

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

Что это говорит то, что он возвращает истину, если модель не может быть преобразована из строки, и в ShouldShow() метода, он будет показать, если он не является сложным типом, т. е. значение CAN может быть преобразовано из строки.

Что вам нужно сделать, это создать 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 
} 

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

Смежные вопросы