Asp.net mvc ModelMetadata:ShowForEdit属性似乎不起作用
Iv编写了一个类似下面的MetaDataProvider,我将其与编辑器模板结合使用。DisplayName工作正常,但由于某些原因,ShowForEdit值无效。有什么想法吗Asp.net mvc ModelMetadata:ShowForEdit属性似乎不起作用,asp.net-mvc,metadata,data-annotations,modelmetadata,Asp.net Mvc,Metadata,Data Annotations,Modelmetadata,Iv编写了一个类似下面的MetaDataProvider,我将其与编辑器模板结合使用。DisplayName工作正常,但由于某些原因,ShowForEdit值无效。有什么想法吗 public class MyModelMetadataProvider : DataAnnotationsModelMetadataProvider { protected override ModelMetadata CreateMetadata(IEnumerable<Attribute>
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;
}
}
公共类MyModelMetadataProvider:DataAnnotationsModelMetadataProvider
{
受保护的重写ModelMetadata CreateMatadata(IEnumerable属性,类型containerType,
Func modelAccessor,类型modelType,字符串propertyName)
{
var metadata=base.CreateMetadata(属性、containerType、modelAccessor、modelType、propertyName);I
metadata.DisplayName=“测试”;
metadata.ShowForEdit=false;
metadata.ShowForDisplay=false;
metadata.hidesurroundingtml=true;
返回元数据;
}
}
这似乎与问题类似,因此我将在这里重复我的答案: 您要将其应用于什么类型的属性?如果使用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的IntInstance(可能不是),然后检查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
}
准备好后,再试一次,看看是否有帮助