【问题标题】:Data Annotations for a subset of properties属性子集的数据注释
【发布时间】:2010-09-01 13:46:10
【问题描述】:

我一直在阅读数据注释(即Scott Guthrie's blog post),我对在一个地方拥有验证逻辑的概念感到非常兴奋。

在提示用户输入与给定类关联的属性子集时,是否有人能够成功使用此技术?

例如(伪代码)...

public class Person
{
  [Required]
  public string Name

  [Required]
  public string Email
}

然后假设您有一个仅显示带有名称的表单的视图。该视图的 HttpPost 控制器中 ModelState.IsValid 的值将始终为 false,因为 Email 是必需的并且缺少。

我曾考虑使用单独的模型,一个用于仅需要名称的部分,另一个用于需要名称和电子邮件的部分,但是我违反了 DRY 原则,因为我将进行名称验证逻辑在两个地方。

有什么建议吗?可以让数据注释以这种方式工作吗?我应该只是有两个单独的课程吗?也许CustomValidationAttribute 在确定是否需要电子邮件之前检查标志?

【问题讨论】:

  • 我不是一个为自己的答案而自豪的人,但我看到史蒂夫桑德森在blog.stevensanderson.com/2010/02/19/… 解决了这个问题 - 如果有人想阅读并发布答案...... :)
  • 默认的 MVC 1 行为被更改是有充分理由的。我会非常非常小心史蒂夫的解决方案。

标签: .net asp.net-mvc validation data-annotations


【解决方案1】:

每个视图都应该有自己的视图模型。有时您可以重用一些现有的视图模型 - 这是您不能重用的时候。

只有当这些属性是一种形式时,我才会创建自定义属性,有时两者都是必需的,有时只需要其中一个。如果您有单独的视图,我会制作另一个视图模型。

【讨论】:

  • 作为 ASP.NET MVC 的新手,我不完全确定“每个视图都应该有自己的视图模型”的有效性。事实上,在我上面提供的 Sanderson 链接的 cmets 中,有人在争论这个确切的短语。您能否提供进一步讨论此问题的文章的链接?我注意到 Visual Studio 模板似乎遵循这一点(即 ChangePasswordModel 和 LogOnModel),但我找不到太多关于它的信息。
  • @Mayo,因为这些观点中的每一个在不同的上下文中都意味着完全不同的事情。它们不共享继承,甚至不共享关系,只是相似之处在于它们共享一些属性。 domaindrivendesign.org/node/91
  • 感谢 jfar 和 Necros - 我认为我正在寻找的是拥有域模型和视图模型的行为。
猜你喜欢
  • 1970-01-01
  • 2011-08-08
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多