好吧,假设我正在尝试根据枚举的值有条件地验证对象,我该怎么做?
这是一个验证对象的示例调用.
MyObjectValidator validator = new MyObjectValidator();
ValidationResult results = validator.Validate(new MyObject());
Run Code Online (Sandbox Code Playgroud)
这是一个具有枚举值的类的示例.
public class MyObjectValidator : AbstractValidator<MyObject>
{
public MyObjectValidator()
{
RuleFor(x => x.anEnum).Equal(MyObject.MyEnum.First).SetValidator(new FirstValidator());
}
}
public class FirstValidator : AbstractValidator<MyObject>
{
public FirstValidator()
{
RuleFor(x => x.someDecimal).Equal(1).WithMessage("Decimal must equal 5 with anEnum set to First");
}
}
public class MyObject
{
public enum MyEnum : int
{
First = 0,
Second = 1,
Third = 2
}
public decimal someDecimal { get; set; }
public MyEnum anEnum …Run Code Online (Sandbox Code Playgroud) 我在ASP.NET MVC 4项目中使用FluentValidation框架进行服务器端和客户端验证.
是否有原生(非黑客)方式来验证字符串长度只有最大长度,或只有最小长度?
例如这样:
var isMinLengthOnly = true;
var minLength = 10;
RuleFor(m => m.Name)
.NotEmpty().WithMessage("Name required")
.Length(minLength, isMinLengthOnly);
Run Code Online (Sandbox Code Playgroud)
默认错误消息模板应该不是
'Name' must be between 10 and 99999999 characters. You entered 251 characters.
但
'Name' must be longer 10 characters. You entered 251 characters.
并且应该支持客户端属性,例如黑客RuleFor(m => m.Name.Length).GreaterThanOrEqual(minLength)(不确定它是否有效)不适用.
我正在使用ServiceStack实现Api.我的解决方案的一个关键方面是积极的验证策略.
我使用ServiceStack的ValidationFeature,这意味着如果在应用程序容器中注册了IValidator <ReqDto>(或其后代:AbstractValidator <ReqDto>),则验证将在服务之前自动运行.
通过积极验证,我的意思是我检查所有可能的错误情况,以及验证器级别的逻辑验证.因此,我的服务逻辑非常简洁.
从实际的角度来看,服务验证的服务逻辑的这种独立性是非常好的,因为它提供了非常容易阅读和推理服务逻辑/实现的原因.但是,我开始认为FluentValidation的规则和规则集更适合简单的格式验证,而不是直接在我正在进行的数据库访问(主要是测试源自请求中提取的ID的404错误).
问题:
1:验证逻辑在概念上访问数据库是否不正确?
2:从我所看到的,到目前为止,包括SS源,我没有找到一个形式来定义的情况下,如FluentValidation规则:从请求拉一个ID,访问数据库中检索一个实体,并抛出一个404如果没有找到进入.我只使用FV规则来定义基本格式验证,例如:
RuleFor(x => x.UserName).NotEmpty();
RuleFor(x => x.Password).NotEmpty();
Run Code Online (Sandbox Code Playgroud)
其余的我手动做.有解决这个问题的人吗?
注意:这不是关于如何将ValidationResult/ValidationError转换为HttpResult/HttpError的问题.通过使用SS 3.9.44中引入的ValidationFeature的ErrorResponseFilter,我已经介绍过了.谢谢
例如,FluentValidation验证用户输入的空电子邮件地址。
我链接了两个函数,但它跳过.NotEmpty().WithMessage()并跳转到下一个是EmailAddress().WithMessage()。
RuleFor(r => r.EmailAddress)
.NotEmpty().WithMessage("Email address is required.")
.EmailAddress().WithMessage("Email address is not valid.");
Run Code Online (Sandbox Code Playgroud)
为什么错误消息是"Email address is not valid."链中的第一个错误消息"Email address is required."?
我正在构建具有以下层的应用程序
数据 - 实体框架上下文实体 - 实体框架POCO对象服务 - 由WebApi调用以加载/保存实体WebApi -
现在我相信我应该将我的业务逻辑放入服务层,因为我有实体服务,例如,我有Family对象和Family Service.
要使用FluentValidation创建验证对象,似乎必须从AbstractValidator继承,因为我的服务已经从一个对象继承这是不可能的(或者是它)?
我想我唯一的选择是在服务层创建一个FamilyValidator并从服务中调用此验证器?
fluentValidation是我最好的选择,还是我在这里混淆了什么?
c# entity-framework business-logic fluentvalidation asp.net-web-api
可能非常愚蠢的问题,但是在这方面需要帮助。
我将MVC Fluent验证规则添加到模型属性中,但是由于某种原因,其中一个验证规则失败。添加了一个正则表达式以允许使用英语和西班牙语字符,并且不允许使用除-和'以外的数字或特殊字符。由于某些原因,当用户输入多个有效字符作为输入时,仍会显示错误。
当用户输入为aA时仍显示错误
我正在使用此RegE @“ ^ [a-zA-Z-'] $”) 允许用户使用英语和西班牙语字符,除-和'外,不允许使用任何数字或特殊字符。
任何帮助表示赞赏。
RuleFor(x => x.FirstName)
.NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_PersonalDetails_1001_firstname)
.Length(1,
20).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100006_maxlength)
.Matches(@"^[a-zA-Z-']$").WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_PersonalDetails_100007_validname);
Run Code Online (Sandbox Code Playgroud) 我们有一个条件要求,即只有在打开标志时才应将空规则应用于字段.类似下面的代码.
这是正确的方法吗?
public AccountSetupModelValidator(ISessionProvider sessionProvider)
{
var regexPatterns = new RegExPatterns();
RuleFor(x => x.MemorableDate)
.NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_memorabledate);
RuleFor(x => x.MemorableDateAnswer)
.NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_memorabledateanswer)
.Matches(regexPatterns.MemorableDateFormat).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_memorabledateinvalidformat)
.Length(5).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100006_maxlength);
RuleFor(x => x.SecurityQuestion)
.NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_securityquestion);
RuleFor(x => x.SecurityAnswer)
.NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_securityanswer)
.Length(1, 40).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100006_maxlength);
if (sessionProvider.OnboardingApplicationData.ToggleNavigationView.HasProvisionalAccount)
{
RuleFor(x => x.TempCardNumber)
.NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
.Matches(regexPatterns.NumericOnly)
.WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
.Length(15).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard);
RuleFor(x => x.SecurityCode)
.NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
.Matches(regexPatterns.NumericOnly)
.WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
.Length(4).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_securitycode);
}
}
Run Code Online (Sandbox Code Playgroud) 我在NancyFX应用程序中使用Fluent验证.使用nuget包安装:Nancy.Validation.FluentValidation
我编写了自己的属性Validator类,并完成了可以通过Strings.invalid_ip属性获取的错误消息的本地化.
所有其他本地化在我的项目中工作正常,Fluent验证例外,它无法在Strings资源管理器类中找到任何属性.
namespace LmsNg.Validators
{
public class IsIpAddressValidator : PropertyValidator
{
public IsIpAddressValidator()
: base(() => Strings.invalid_ip)
//also tried another overload, but the same exception happens
//base("invalid_ip", typeof(Strings))
{
}
protected override bool IsValid(PropertyValidatorContext context)
{
var ip = context.PropertyValue as string;
IPAddress address;
if (ip != null && IPAddress.TryParse(ip, out address))
{
return true;
}
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)

一旦IsIpAddressValidator使用,当验证返回false时,我得到一个例外.
FluentValidation.dll中出现"System.InvalidOperationException"类型的异常,但未在用户代码中处理
System.InvalidOperationExcepction: Could not find a property named 'invalid_ip' on …
有人提到我将FluentValidation用于MVC5 C#ASP.NET。我正在尝试将一个字段与其他两个字段进行比较,但出现错误。
我自定义的“ AbstractValidator”中的代码如下:
RuleFor(x => x.Length).LessThanOrEqualTo(y => y.LengthMax)
.GreaterThanOrEqualTo(z => z.LengthMin);
Run Code Online (Sandbox Code Playgroud)
当视图尝试使用EditFor()此错误呈现“长度”字段的控件时,显示...
附加信息:不打扰的客户端验证规则中的验证类型名称必须是唯一的。多次查看以下验证类型:范围
如何将一个值与同一模型的其他两个值进行比较。
有人可以帮我解决这个问题吗?我正在尝试将CustomAsync更改为MustAsync,但是我无法使工作正常。下面是我的自定义方法
RuleFor(o => o).MustAsync(o => {
return CheckIdNumberAlreadyExist(o)
});
private static async Task<ValidationFailure> CheckIdNumberAlreadyExist(SaveProxyCommand command)
{
if (command.Id > 0)
return null;
using (IDbConnection connection = new SqlConnection(ConnectionSettings.LicensingConnectionString))
{
var param = new DynamicParameters();
param.Add("@idnumber", command.IdNumber);
var vehicle = await connection.QueryFirstOrDefaultAsync<dynamic>("new_checkDuplicateProxyIdNumber", param, commandType: CommandType.StoredProcedure);
return vehicle != null
? new ValidationFailure("IdNumber", "Id Number Already Exist")
: null;
}
}
Run Code Online (Sandbox Code Playgroud) fluentvalidation ×10
c# ×8
asp.net-mvc ×4
validation ×2
.net ×1
enums ×1
fluent ×1
localization ×1
nancy ×1
regex ×1
servicestack ×1