2

这是它现在如何工作的示例:

[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 类,元数据在 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; }
}
4

1 回答 1

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);
  }
}

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

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

于 2010-09-28T11:26:20.690 回答