c# - 将数据注释应用于 MVC 中 View 模型的子属性?

标签 c# asp.net-mvc validation data-annotations

在属性上放置简单的数据注释很棒,

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/

相关文章:

asp.net-mvc - 如何向 MVC 应用程序公开内置安全性和用户管理?

javascript - 按钮单击所需的验证不起作用 JavaScript

java - 分层架构中的 Spring Boot Restful API 验证

javascript - 如何在将图像保存到数据库之前验证图像大小和尺寸

c# - XmlSerializer 不填充值

C# 语法 :----- IEnumerable<Person> people = new List<Person>();

c# - 如何在进行重定向之前确保 Controller 和操作存在,asp.net mvc3

c# - 进行测验

c# - asp.net mvc c#获取来自的页面的url

asp.net-mvc - 如何在asp.net mvc页面之间保存表单数据?