代码之家  ›  专栏  ›  技术社区  ›  UpTheCreek

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

  •  3
  • UpTheCreek  · 技术社区  · 14 年前

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

    似乎只有一个属性可以改变这一点 [ScaffoldColumn] ,设置两个 炫耀 ShowForDisplay 这不是我想做的。我想能够在我的模型上分别注释这两个。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Community ahmed    7 年前

    因为它不受开箱即用的支持。Afaik的原因是,支持此功能的dataAnnotations属性位于.NET 4.0中,为了使MVC 3.5和4.0兼容,必须排除它们。

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

    Showing Different fields in EditorForModel vs. DisplayForModel modes in MVC2

        2
  •  5
  •   Matthew Abbott    14 年前

    您要应用它的属性类型是什么?如果使用Reflector,我们可以发现ShowForEdit和ShowForDisplay属性用于以下函数:

    showforedit:system.web.mvc.html.defaulteditoremplates.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(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
    }
    

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