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