除了将 MetadataTypeAttribute 直接放在类上之外,是否有其他方法可以指导 ASP.NET MVC 有关某些类元数据的信息?

StackOverflow https://stackoverflow.com/questions/3811967

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

[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; }
}
有帮助吗?

解决方案

我在用着 Mvc扩展. 。其中一个功能是描述元数据的好方法,如下所示:

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top