gpt4 book ai didi

c# - 类/模型级别验证(相对于属性级别)? (ASP.NET MVC 2.0)

转载 作者:可可西里 更新时间:2023-11-01 07:43:57 24 4
gpt4 key购买 nike

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

我查看了 scott guthries 扩展属性并在数据注释声明中使用它的方法,但是,正如我所见,无法在多个属性上声明数据注释样式的属性,您只能放置声明(例如 [Email]、[Range]、[Required])超过一个属性 :(。

我已经查看了当您开始一个新项目时出现的默认 mvc 2.0 项目中的 PropertiesMustMatchAttribute,这个示例就像使用一对针来检查您的机油一样有用 - 没用!

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

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

最佳答案

既然您已经查看了数据注释并得出它们不适合您的场景的结论,我建议您查看 FluentValidation , 它的 integration with ASP.NET MVC以及你的方式unit test your validation logic - 你不会失望的(我真的不反对数据注释,它们非常适合博客文章和教程,但一旦你面对现实世界的应用程序,你很快就会意识到它的局限性)。


更新:

根据评论部分的要求,这里有一个使用 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;
}
}

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

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");
}
}

关于c# - 类/模型级别验证(相对于属性级别)? (ASP.NET MVC 2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com