代码之家  ›  专栏  ›  技术社区  ›  Piotr Owsiak

有什么方法可以指导吗ASP.NET除了将MetadataTypeAttribute直接放在类上之外,MVC还有什么其他的类元数据吗?

  •  2
  • Piotr Owsiak  · 技术社区  · 14 年前

    下面是它现在的工作原理示例:

    [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 回复  |  直到 14 年前
        1
  •  3
  •   Arnis Lapsa    14 年前

    我在用 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);
      }
    }
    

    最妙的是,这允许以强类型的方式使用资源进行本地化。

    使用这个的缺点是,有一堆其他东西捆绑在一起,你可能不想使用。

    推荐文章