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