除了将MetadataTypeAttribute直接放在类上之外,有没有办法向ASP.NET MVC指示一些类元数据?

时间:2010-09-28 10:53:51

标签: asp.net-mvc modelmetadata metadatatype

以下是现在如何运作的示例:

[MetadataType(typeof(PersonMetadata))]
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class PersonMetadata
{
    [Required]
    public string Name { get; set; }
    [Range(0,150]
    public int Age { get; set; }
}

但是我不希望将MetadataAttribute放在Person类上,而是想要一些告诉MVC框架的方法“嘿,如果遇到Person类,metadate在PersonMetadata类中”。

这只是颠倒了我感觉更具成分性并遵循开放式原则的方向,因为我不需要触及Person类来用元数据“扩展”它。
我知道这会产生一个可能存在多个和冲突的元数据的问题,这也增加了复杂性,但灵活性总是需要付出代价。

我想要一种编程方式或声明方式,或者最好两种方式:)

所以可能是这样的:

MetadataTypeMappings.Add(typeof(Person), typeof(PersonMetadata));

另一个可能是:

[MetadataFor(typeof(Person)]
public class PersonMetadata
{
    [Required]
    public string Name { get; set; }
    [Range(0,150]
    public int Age { get; set; }
}

1 个答案:

答案 0 :(得分:3)

我正在使用MvcExtensions。其中一个功能是描述这样的元数据的好方法:

public class ProductEditModelConfiguration : 
  ModelMetadataConfiguration<ProductEditModel>
{
  public ProductEditModelConfiguration()
  {
    Configure(model => model.Id).Hide();
    Configure(model => model.Name)
      .DisplayName(() => LocalizedTexts.Name)
      .Required(() => LocalizedTexts.NameCannotBeBlank)
      .MaximumLength(64, () => 
        LocalizedTexts.NameCannotBeMoreThanSixtyFourCharacters);
  }
}

整洁的事情是 - 这允许以强类型的方式使用资源进行本地化。

使用它的缺点 - 捆绑了许多你可能不想使用的东西。