属性级验证错误会阻碍类级验证的验证

Cod*_*key 6 validation asp.net-mvc data-annotations asp.net-mvc-3 asp.net-mvc-2

Bounty获奖后更新

一个新的解决方案正在解决这个问题.请参考ASP.NET MVC 3预览1:http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx

查看模型验证改进部分,您将在其中看到我的问题的解决方案.


原帖

参考我之前的文章如何使用ASP.NET MVC 2验证两个属性,其中我问我如何比较模型验证的两个属性.

我确实觉得这个答案很有用,但我遇到了一个完全不同的问题:

问题:如果属性级ValidationAttribute包含错误,则不验证类级别ValidationAttributes.

请考虑以下事项:

[EqualTo("Email", "EmailConfirm", ErrorMessage = "E-mailadresserne skal være ens")]
[EqualTo("Password", "PasswordConfirm", ErrorMessage = "Adgangskoderne skal være ens")]
[Bind(Exclude="UserId")]
public class EditSiteUser
{
    [Required(ErrorMessage="Du skal bekræfte adgangskode")]
    public string PasswordConfirm { get; set; }

    [Required(ErrorMessage="Du skal bekræfte e-mailadressen")]
    [Email(ErrorMessage="Ugyldig e-mailadresse")]
    public string EmailConfirm { get; set; }
    public int UserId { get; set; }

    [Required(ErrorMessage = "Du skal indtaste et brugernavn")]
    public string Username { get; set; }

    [Required(ErrorMessage = "Du skal indtaste en adgangskode")]
    public string Password { get; set; }

    [Required(ErrorMessage = "Du skal indtaste en e-mailadresse")]
    [Email(ErrorMessage = "Ugyldig e-mailadresse")]
    public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我有两个类级别的attibutes验证EmailConfirm和PasswordConfirm.

如果像Username这样的字段为空,从而产生错误,则永远不会验证两个EqualTo属性.

有没有人有建议克服这个问题?

编辑:如果您需要有关此问题的更多信息,请在评论中提问,我将非常乐意为您提供所需的任何其他信息.

问题:

问:"如果属性级别检查失败,为什么对类级别检查进行验证很重要?".

答:"因为这是表单的一部分,用户将信息输入到通过AJAX回发的表单中.当表单返回时,它应显示所有当前问题."

问:"你在课堂上放置的EqualTo属性到底是什么?它是自定义验证属性吗?如果是,它是如何工作的?它有什么作用?"

答:EqualTo是一个类级ValidationAttribute,它比较类实例的两个属性的值.查找"PropertiesMustMatchAttribute"以获得类似的实现.

Jam*_*Ide 6

这不受支持.如果任何属性级别验证失败,则不执行类级别验证.我建议你看一下MVC Foolproof Validation.它扩展了MVC验证,以增加对或有属性验证的支持.我认为这可以解决这个特殊情况的问题.

项目站点声明它不能与MVC2 RC一起使用,因此您必须下载源代码并让它自己运行/采用他们的想法.

  • 我不会说将验证属性放在类上是错误的,因为每种情况都不同.我会说最好在可能的情况下将它们放在属性上,以便用户获得更好的体验. (2认同)