Asp.net mvc 使用数据注释进行MVC验证-不使用数据注释的场景';不起作用,还有其他选择吗?

Asp.net mvc 使用数据注释进行MVC验证-不使用数据注释的场景';不起作用,还有其他选择吗?,asp.net-mvc,asp.net-mvc-2,data-annotations,Asp.net Mvc,Asp.net Mvc 2,Data Annotations,因此,我一直在MVC项目中使用数据注释进行验证,它们似乎在大多数情况下都有效 下面是我当前项目中的两个例子,它们似乎不适合,我不确定在哪里进行验证 1) 我有一个加入联盟页面,其中包含一个表单,登录用户在其中输入他们的团队名称并单击以加入联盟。当他们提交表单时,我需要确保当前用户在联盟中没有团队。因此,它基本上需要查询数据库中的用户id和联盟id,以确保用户不存在任何团队。我的ViewModel不包含用户id,因为它与视图无关 2) 在同一页面上,我还需要确保团队名称是唯一的。如果您只是想查看它

因此,我一直在MVC项目中使用数据注释进行验证,它们似乎在大多数情况下都有效

下面是我当前项目中的两个例子,它们似乎不适合,我不确定在哪里进行验证

1) 我有一个加入联盟页面,其中包含一个表单,登录用户在其中输入他们的团队名称并单击以加入联盟。当他们提交表单时,我需要确保当前用户在联盟中没有团队。因此,它基本上需要查询数据库中的用户id和联盟id,以确保用户不存在任何团队。我的ViewModel不包含用户id,因为它与视图无关

2) 在同一页面上,我还需要确保团队名称是唯一的。如果您只是想查看它是否存在于表中,那么这很容易。您可以创建一个自定义验证属性,用于查询字段值的表。然而,我需要看看它是否存在于某个联赛id的表格中(他们加入的联赛)

除了琐碎的验证之外,数据注释似乎不是一个理想的解决方案。我当前的解决方案是在post-action方法的开始处查询数据库,并手动将错误添加到ModelState中。(是的,糟透了)


有什么想法吗?

我认为考虑一下输入验证和业务逻辑之间的区别可能会有所帮助。艾恩德对此有一些想法


像“当他们提交表单时,我需要确保当前用户在联盟中没有团队”这样的规则听起来像是业务逻辑,而不是输入验证,您可能希望以不同的方式处理它。例如,这种逻辑可以进入“用户”类或类似类的“CanSave”方法中——关键是如果可以的话,将其与输入验证分开。

我认为这可能有助于考虑输入验证和业务逻辑之间的区别。艾恩德对此有一些想法


像“当他们提交表单时,我需要确保当前用户在联盟中没有团队”这样的规则听起来像是业务逻辑,而不是输入验证,您可能希望以不同的方式处理它。例如,这种逻辑可以进入“User”类或类似类的“CanSave”方法中——关键是如果可以的话,将其与输入验证分开。

虽然我同意Steve的观点,但DataAnnotations有一个基本ValidationAttribute,您可以在其中实现任何您想要的功能。说它只能做一些琐碎的事情是不准确的,事实上,有了这个扩展点,你几乎可以做任何你想做的事情

现在,由于代码中有数据库逻辑,服务位置到处都是,因此存在一些问题,但是可以选择清理这些问题。DataAnnotations通过ModelValidatorProvider类应用,该类可以像ControllerFactorys或ViewEngines一样轻松配置

添加(新的YourCustomProvider())


现在,在这种情况下,您可以做的是让验证器提供程序在属性中提供持久层代码。因此,代码保持干净,但您可以使用触及数据库的自定义数据注释属性。

尽管我同意Steve的观点,但DataAnnotations有一个基本ValidationAttribute,您可以在其中实现任何您想要的功能。说它只能做一些琐碎的事情是不准确的,事实上,有了这个扩展点,你几乎可以做任何你想做的事情

现在,由于代码中有数据库逻辑,服务位置到处都是,因此存在一些问题,但是可以选择清理这些问题。DataAnnotations通过ModelValidatorProvider类应用,该类可以像ControllerFactorys或ViewEngines一样轻松配置

添加(新的YourCustomProvider())

现在,在这种情况下,您可以做的是让验证器提供程序在属性中提供持久层代码。因此,代码保持干净,但您可以使用触及数据库的自定义数据注释属性