Lev*_*kon 7 c# validation asp.net-mvc data-annotations
在属性上放置简单的数据注释很棒,
public class UnicornViewModel
{
[Required]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
但是让我说我有这样的事情:
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; }
Run Code Online (Sandbox Code Playgroud)
如何在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; }
Run Code Online (Sandbox Code Playgroud)
通常不支持:ASP.NET MVC3 Validation of Nested View Model object fields
但是您可以实现自定义模型验证,但对客户端和服务器端执行此操作会变得非常复杂。
如果您有自己的 SuperPower 对象模板,它可能会查找您自己创建的属性:
[RequiredSubProperty("Name")]
public SuperPower PrimarySuperPower { get; set; }
Run Code Online (Sandbox Code Playgroud)
在模板中,将不显眼的验证属性放入 TextBoxFor 或您使用的任何输入帮助器的 htmlAttributes 参数中。
如果您不使用模板,我会放弃所有这些,只在显示第一个名称时将不引人注目的验证属性传递到 htmlAttributes 参数中,但不显示第二个名称。
另一种选择是将 UnicornViewModel 展平,例如
public class UnicornViewModel
{
[Required]
public string Name { get; set; }
[Required]
public string PrimarySuperPowerName { get; set; }
public string SecondarySuperPowerName { get; set; }
Run Code Online (Sandbox Code Playgroud)
这完全取决于您可以从更复杂的方法中获得多少重用。当我尝试大量使用模板时,我发现在不同的上下文中,模板的某些内容没有意义,因此我需要对象模板上的很多变体(当子模板显示在父级页面上时,它会对于子级来说,拥有链接到父级详细信息的 URL 是没有意义的,因为您已经在该页面上,但在使用子级模板的其他任何地方,它都应该显示到父级的链接)。最终我停止使用模板,偶尔在有大量重用的情况下使用部分模板。UI 是橡胶与道路相遇的地方,ViewModel 的结构不会像实体/业务模型那样好。