我有 ac# 模型类 (Address.cs),看起来像这样......
namespace myProject.Models
{
[Validator(typeof(AddressValidator))]
public class Address
{
public string AddressLine1 { get; set; }
public string PostCode { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个验证器类(AddressValidator.cs),看起来像这样......
namespace myProject.Validation
{
public class AddressValidator : AbstractValidator<Address>
{
public AddressValidator()
{
RuleFor(x => x.PostCode).NotEmpty().WithMessage("The Postcode is required");
RuleFor(x => x.AddressLine1).MaximumLength(40).WithMessage("The first line of the address must be {MaxLength} characters or less");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何为我的验证器类添加单元测试,以便我可以测试“地址行 1”最多占用 40 个字符?
当我为单个类的属性制定简单规则时,我发现 FluentValidation 很简单,但是一旦我需要比较集合中的值(例如属性List<T>),它就会变得非常棘手。假设以下两个最小类:
public class PurchaseOrder
{
public List<LineItem> LineItems { get; set; }
public decimal Total { get; set; }
public PurchaseOrder()
{
LineItems = new List<LineItem>();
}
}
public class LineItem
{
public decimal Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
还有这个类:
class Program
{
static void Main(string[] args)
{
PurchaseOrder order = new PurchaseOrder();
order.LineItems.Add(new LineItem() { Price = 12m });
order.LineItems.Add(new LineItem() { Price = 14m });
order.Total = 26m;
PurchaseOrderValidator validator = new PurchaseOrderValidator(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 FluentValidation 来验证属性“用户名”是否另一个属性“找到”为 true。
Object Contains:
string Username
bool Found
RuleFor(x => x.Username)
.NotEmpty().DependentRules(() => {
RuleFor(y => y.Found).Equals(true); //Not valid syntax
})
.WithMessage("Not Found");
Run Code Online (Sandbox Code Playgroud)
不幸的是,似乎没有简单的方法可以做到这一点?
我有以下 FluentValidation 扩展方法来验证电话号码:
public static IRuleBuilderOptions<T, string> MatchPhoneNumber<T>(this IRuleBuilder<T, string> rule)
=> rule.Matches(@"^(1-)?\d{3}-\d{3}-\d{4}$").WithMessage("Invalid phone number");
Run Code Online (Sandbox Code Playgroud)
我称之为:
RuleFor(contact => contact.PhoneNumber).MatchPhoneNumber()
Run Code Online (Sandbox Code Playgroud)
但是,我只希望扩展方法在电话号码字符串不为空/空时验证电话号码。我可以通过执行以下操作来做到这一点:
RuleFor(contact => contact.PhoneNumber)
.MatchPhoneNumber()
.When(contact => !string.IsNullOrEmpty(contact.PhoneNumber));
Run Code Online (Sandbox Code Playgroud)
但有没有办法可以在扩展方法本身中做到这一点?
在 ASP.NET Core-6 Web API 中,我使用 FluentValidation.AspNetCore(11.2.1)。
我在 Program.cs 中有这段代码:
builder.Services.AddMvc().AddFluentValidation(fv => {
fv.DisableDataAnnotationsValidation = true;
fv.RegisterValidatorsFromAssembly(typeof(Program).Assembly);
fv.RegisterValidatorsFromAssembly(Assembly.GetExecutingAssembly());
fv.ImplicitlyValidateChildProperties = true;
fv.ImplicitlyValidateRootCollectionElements = true;
fv.AutomaticValidationEnabled = true;
});
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误,上面的所有代码都突出显示:
FluentValidationMvcExtensions.AddFluentValidation(IMvcBuilder, Action)' 已过时:'不推荐调用 AddFluentValidation()
我该如何解决这个问题?
谢谢
我一直在审查FluentValidation哪个是一个很好的验证库,但我注意到它们传入LambdaExpression而不是对象属性,我想了解这种用法的优点:
using FluentValidation;
public class CustomerValidator: AbstractValidator<Customer> {
public CustomerValidator() {
RuleFor(customer => customer.Surname).NotEmpty();
RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
RuleFor(customer => customer.Company).NotNull();
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
RuleFor(customer => customer.Address).Length(20, 250);
RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
}
private bool BeAValidPostcode(string postcode) {
// custom postcode validating logic goes here
}
}
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = …Run Code Online (Sandbox Code Playgroud) 我正在使用ASP.NET 4和Fluent Validation。
我正在尝试设置一个规则来检查我的用户名是否以“ adm”开头。
我有以下内容,给我错误。我尝试关注在线示例,但无法正常工作:
RuleFor(x => x.UserName)
.NotNull()
.WithMessage("Required")
.Must(x => x.UserName.StartsWith("adm"))
.WithMessage("Must start with ADM");
Run Code Online (Sandbox Code Playgroud)
我认为我做的不正确吗?
我尝试了以下活动:
.Must(x => x.UserName.Substring(0, 3) == "adm")
Run Code Online (Sandbox Code Playgroud)
两者均出现错误:
Delegate 'System.Func<MyProject.ViewModels.LogOnViewModel,string,bool>' does not take 1 arguments
Run Code Online (Sandbox Code Playgroud) public bool IsDefault { get; set; }
RuleFor(stockImage => stockImage.IsDefault).NotNull();
我有这个规则,IsDefaultboolean属性不应该为null.问题是当客户端在命中api时没有传递此字段,IsDefault将默认布尔属性设置为false并且不提供任何错误,例如"此字段是必需的".
如何根据需要将此字段设为"true"或"false"作为其唯一有效输入?
我试过的一个解决方案就是:
RuleFor(stockImage => stockImage.IsDefault).NotEmpty();
这个问题是它在IsDefault"假" 时给出验证错误,这不是预期的用例.
我有一个C#WebApi项目,并且正在使用FluentValidation.WebApi包来验证客户端输入。
下面是我的模型类代码,它具有名为“ IsPremium”的C#属性。对于所有客户端,此属性均具有json名称“ isLuxury”。
[Serializable, JsonObject, Validator(typeof(ProductValidator))]
public class Product
{
[JsonProperty("isLuxury")]
public bool? IsPremium { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的验证器类如下所示:
public class ProductValidator : AbstractValidator<Product>
{
public ProductValidator()
{
RuleFor(product => product.isPremium).NotNull();
}
}
Run Code Online (Sandbox Code Playgroud)
所以对于这样的请求: http:// localhost:52664 / api / product
请求正文:{“ isLuxury”:“”}
我收到以下错误:
{
"Message": "The request is invalid.",
"ModelState": {
"product.isPremium": [
"'is Premium' must not be empty."
]
}
}
Run Code Online (Sandbox Code Playgroud)
流利的选择了C#属性名称,这对客户端没有意义,因为它知道它是“ isLuxury”。如何强制Fluent从json属性而不是c#属性中选择名称,以提供更好的验证,例如“'isLuxury'不能为空。”?
如果不可能的话,我将不得不重命名我所有的C#属性,使其具有与公开给所有客户端的json相同的名称。请提出您是否还有其他更好的方法来解决此问题。
我正在使用NancyFX和FluentValidation,如https://github.com/NancyFx/Nancy/wiki/Nancy-and-Validation所述.我的网络应用程序运行正常,验证工作正常,但当我尝试对任何使用验证的模块进行单元测试时,我收到错误
Nancy.Validation.ModelValidationException : No model validator factory could be located.
Please ensure that you have an appropriate validation package installed, such as
one of the Nancy.Validation packages.
Run Code Online (Sandbox Code Playgroud)
我已经验证我的单元测试项目引用了 Nancy.Validation.FluentValidation和FluentValidation程序集.
我的测试代码如下所示:
public class ArticleModuleTests {
private Browser browser;
private IDatabase db;
const int USER_ID = 123;
const int ARTICLE_ID = 456;
[SetUp]
public void SetUp() {
var user = new User { Username = "test", Id = USER_ID };
db = A.Fake<IDatabase>();
browser = new Browser(with …Run Code Online (Sandbox Code Playgroud) fluentvalidation ×10
c# ×8
unit-testing ×2
asp.net ×1
asp.net-core ×1
json ×1
lambda ×1
nancy ×1