在属性上添加简单的数据注释非常棒,
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 上应用“必需”属性,同时将其保留为“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 嵌套视图模型对象字段的验证 https://stackoverflow.com/questions/8899740/asp-net-mvc3-validation-of-nested-view-model-object-fields
但是您可以实现自定义模型验证,但对客户端和服务器端执行此操作会变得非常复杂。
如果您有自己的 SuperPower 对象模板,它可能会查找您自己创建的属性:
[RequiredSubProperty("Name")]
public SuperPower PrimarySuperPower { get; set; }
在模板中,将不显眼的验证属性放入 TextBoxFor 或您使用的任何输入帮助器的 htmlAttributes 参数中。
如果您不使用模板,我会放弃所有这些,只在显示第一个名称时将不显眼的验证属性传递到 htmlAttributes 参数中,但不显示第二个名称。
另一种选择是将 Unicorn ViewModel 展平,例如
public class UnicornViewModel
{
[Required]
public string Name { get; set; }
[Required]
public string PrimarySuperPowerName { get; set; }
public string SecondarySuperPowerName { get; set; }
这完全取决于您可以从更复杂的方法中获得多少重用。当我尝试大量使用模板时,我发现在不同的上下文中,模板的某些内容没有意义,因此我需要对象模板上的很多变体(当子模板显示在父级页面上时,它会对于子级来说,拥有链接到父级详细信息的 URL 是没有意义的,因为您已经在该页面上,但在使用子级模板的其他任何地方,它都应该显示到父级的链接)。最终我停止使用模板,偶尔在有大量重用的情况下使用部分模板。 UI 是橡胶与道路相遇的地方,ViewModel 的结构不会像实体/业务模型那样好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)