ASP.NET MVC:为什么我不能用属性设置ShowForEdit模型元数据?

时间:2010-06-10 09:09:25

标签: asp.net-mvc asp.net-mvc-2 metadata

为什么我不能用属性设置ShowForEdit模型元数据?

似乎提供的唯一属性是[ScaffoldColumn],它设置了ShowForEditShowForDisplay,这不是我想要做的。我希望能够在我的模型上单独注释这两个。

2 个答案:

答案 0 :(得分:5)

您申请的财产类型是什么?如果我们使用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
}

有了这个,再试一次,看看是否有帮助。

答案 1 :(得分:5)

因为它不支持开箱即用。 AFAIK的原因是因为支持此功能的dataannotations属性位于.net 4.0中,为了使MVC 3.5和4.0兼容,必须将它们排除在外。

解决此问题的最简单方法是必须实现您自己的编辑/显示属性,如本问题/答案中所示:

Showing Different fields in EditorForModel vs. DisplayForModel modes in MVC2