これは、属性を使用して 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
}
それが整ったら、もう一度試して、それが役立つかどうかを確認してください.