为什么我不能使用属性设置ShowForEdit
模型元数据?ASP.NET MVC:为什么我不能使用属性设置ShowForEdit模型元数据?
似乎提供的唯一属性是[ScaffoldColumn]
,它同时设置了ShowForEdit
和ShowForDisplay
,这不是我想要做的。我希望能够在我的模型上分别注释这两个。
为什么我不能使用属性设置ShowForEdit
模型元数据?ASP.NET MVC:为什么我不能使用属性设置ShowForEdit模型元数据?
似乎提供的唯一属性是[ScaffoldColumn]
,它同时设置了ShowForEdit
和ShowForDisplay
,这不是我想要做的。我希望能够在我的模型上分别注释这两个。
因为它不支持开箱即用。 AFAIK的原因是因为支持该功能的dataannotations属性在.net 4.0中,为了使MVC 3.5和4.0兼容,必须排除它们。
解决这个问题的最简单方法是要实现自己的编辑/查看属性在此问题/答案证明:
Showing Different fields in EditorForModel vs. DisplayForModel modes in MVC2
您正在使用的属性类型是什么?如果我们使用反射,我们可以发现,ShowForEdit和ShowForDisplay属性在以下功能使用:
ShowForEdit:System.Web.Mvc.Html.DefaultEditorTemplates.ShouldShow(...)
ShowForDisplay:系统.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),你可以看到,它是检查模型是否是a EntityState的实例(可能不是),然后检查metadata.IsComplexType。
我们可以看看IsComplexType物业位置:
public virtual bool IsComplexType
{
get
{
return !TypeDescriptor.GetConverter(this.ModelType).CanConvertFrom(typeof(string));
}
}
那是什么要说的是,它会返回true,如果模型无法从字符串转换,并在ShouldShow()方法,它会显示它是不是一个复杂的类型,即值可以从一个字符串转换。
,你需要做的,是创建一个类型转换器,可以转换为字符串,该模型,如:
模型:
[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
}
随着这一点,再试一次,看看是否有帮助。
哇。我不知道这是疯狂还是辉煌。 ;) – jfar 2010-06-10 15:01:36
大声笑,可能有点这两个;) – 2010-06-10 15:15:32
这将适用于不使用primatives的属性? – 2010-06-10 15:14:09
是的,这适用于非基元。 – jfar 2010-06-10 15:22:54
感谢您的回答。 – UpTheCreek 2010-06-16 11:38:29