类/模型级别验证(与财产级别相对)?(ASP.NET MVC 2.0)

Erx*_*der 15 .net c# vb.net asp.net asp.net-mvc

基本上,标题是什么.我有几个属性组合在一起,真正做出一个逻辑答案,我想运行一个服务器端验证代码(我写),考虑到这些多个字段,并只连接到一个验证输出/错误消息,用户在网页上看到.

我查看了scott guthries扩展属性并在dataannotations声明中使用它的方法,但是,正如我所看到的,没有办法在多个属性上声明dataannotations-style属性,并且您只能放置声明(例如[电子邮件],[范围],[必填])超过一个属性:(.

我查看了启动新项目时出现的默认mvc 2.0项目中的PropertiesMustMatchAttribute,这个示例与使用一对引脚检查机油一样有用 - 没用!

我已经尝试过这种方法,但是,创建一个类级属性,并且不知道如何在我的aspx页面中显示错误.我已经尝试过html.ValidationMessage("ClassNameWhereAttributeIsAdded")和其他各种各样的东西,但它还没有用.我应该提一下,在这个级别上没有一篇关于进行验证的博客文章 - 尽管这是任何项目或业务逻辑场景中的常见需求!

任何人都可以帮助我在我的aspx页面中显示我的消息,并且如果可能的话还有一个适当的文档或参考解释在这个级别的验证?

Dar*_*rov 14

现在,您已经了解了数据注释,并赶到,他们不适合您的方案,我建议你看结论FluentValidation,它与ASP.NET MVC的整合,你会的方式进行单元测试验证逻辑 -你赢了不要感到失望(我真的没有任何反对数据注释,他们非常适合博客文章和教程,但一旦你遇到真实世界的应用程序,你很快就会意识到限制).


更新:

正如评论部分中所要求的,这是一个使用FluentValidation框架和一个服务器端验证函数访问多个属性的示例(请不要这样做,因为它很难看并且有更好的方法):

class AuthInfo
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }
}

class AuthInfoValidator : AbstractValidator<AuthInfo>
{
    public override ValidationResult Validate(AuthInfo instance)
    {
        var result = base.Validate(instance);
        if (string.IsNullOrEmpty(instance.Username))
        {
            result.Errors.Add(new ValidationFailure("Username", "Username is required"));
        }
        if (string.IsNullOrEmpty(instance.Password))
        {
            result.Errors.Add(new ValidationFailure("Password", "Password is required"));
        }
        if (string.IsNullOrEmpty(instance.ConfirmPassword))
        {
            result.Errors.Add(new ValidationFailure("ConfirmPassword", "ConfirmPassword is required"));
        }
        if (instance.Password != instance.ConfirmPassword)
        {
            result.Errors.Add(new ValidationFailure("ConfirmPassword", "Passwords must match"));
        }
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

更自然的方法是执行此操作(它也不受属性重命名的影响,因为它不包含任何魔术字符串):

class AuthInfoValidator : AbstractValidator<AuthInfo>
{
    public AuthInfoValidator()
    {
        RuleFor(x => x.Username)
            .NotEmpty()
            .WithMessage("Username is required");

        RuleFor(x => x.Password)
            .NotEmpty()
            .WithMessage("Password is required");

        RuleFor(x => x.ConfirmPassword)
            .NotEmpty()
            .WithMessage("ConfirmPassword is required");

        RuleFor(x => x.ConfirmPassword)
            .Equal(x => x.Password)
            .WithMessage("Passwords must match");
    }
}
Run Code Online (Sandbox Code Playgroud)