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
}
С этим на месте, попробуйте еще раз и посмотрите, поможет ли это.