在属性上放置简单的数据注释很棒,
public class UnicornViewModel
{
[Required]
public string Name { get; set; }
但是假设我有这样的东西:
public class SuperPower
{
public class Name { get; set; }
}
public class UnicornViewModel
{
[Required]
public string Name { get; set; }
public SuperPower PrimarySuperPower { get; set; }
public SuperPower SecondarySuperPower { get; set; }
如何在 PrimarySuperPower.Name 上应用 Required 属性,同时将其保留为 SecondarySuperPower.Name 可选?最好 1. 与客户端验证相关的东西和 2. 没有任何特殊处理,例如检查 Action/Custom 验证器中 PrimarySuperPower.Name 的值,如果它为空则添加 ModelState 错误。如果有这样的东西就好了:
[Required(p => p.Name)]
public SuperPower PrimarySuperPower { get; set; }
public SuperPower SecondarySuperPower { get; set; }
最佳答案
通常不支持:ASP.NET MVC3 Validation of nested view model object fields
但是您可以实现自定义模型验证,但同时为客户端和服务器端执行此操作会变得相当复杂。
如果您有自己的 SuperPower 对象模板,它可以查找您自己创建的属性:
[RequiredSubProperty("Name")]
public SuperPower PrimarySuperPower { get; set; }
并且在模板中,将不显眼的验证属性传递到 TextBoxFor 的 htmlAttributes 参数或您使用的任何输入助手中。
如果您不使用模板,我会放弃所有这些,只在显示名字时将不显眼的验证属性传递给 htmlAttributes 参数,而不是第二个。
另一种选择是将 UnicornViewModel 展平
public class UnicornViewModel
{
[Required]
public string Name { get; set; }
[Required]
public string PrimarySuperPowerName { get; set; }
public string SecondarySuperPowerName { get; set; }
这完全取决于您可以从更复杂的方法中获得多少重用。当我尝试大量使用模板时,我发现在不同的上下文中关于模板的某些事情没有意义,因此我需要对象模板的很多变体(当子模板显示在父页面上时,它 child 有一个链接到 parent 详细信息的 URL 没有意义,因为您已经在该页面上,但在其他任何使用子模板的地方,它应该显示到 parent 的链接)。最终我停止使用模板,偶尔在有大量重用的情况下使用部分。 UI 是橡胶遇到道路的地方,ViewModel 的结构不会像您的实体/业务模型那样好。
关于c# - 将数据注释应用于 MVC 中 View 模型的子属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17153252/