除了将 MetadataTypeAttribute 直接放在类上之外,是否有其他方法可以指导 ASP.NET MVC 有关某些类元数据的信息?
-
26-09-2019 - |
题
这是它现在如何工作的示例:
[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);
}
}
有趣的是 - 这允许以强类型的方式使用资源进行本地化。
使用它的缺点 - 捆绑了许多其他你可能不想使用的东西。
不隶属于 StackOverflow