'ASP.NET Core Web API - 'IRuleBuilderInitial<CustomerTransactionRequestDto, decimal>' does not contain a definition for 'CustomCurrency'
Validation is done in ASP.NET Core-6 Web API using Fluent Validation. So, I have this code:
Custom Validator:
public static IRuleBuilder<T, string> CustomCurrency<T>(this IRuleBuilder<T, string> ruleBuilder)
{
var options = ruleBuilder
.Matches(@"^\d+.\d{1,2}$")
.WithMessage("Appropriate Currency format should be xxxxxxxxxxx.xx");
return options;
}
DTO:
public class CustomerTransactionRequestDto
{
public decimal Amount { get; set; }
}
Then the validator:
public class CustomerTransactionRequestValidator : AbstractValidator<CustomerTransactionRequestDto>
{
public CustomerTransactionRequestValidator()
{
RuleFor(p => p.Amount).CustomCurrency()
.NotEmpty().WithMessage("Amount should be not empty. ERROR!");
}
}
The problem is that I got this error:
Error CS1929 'IRuleBuilderInitial<CustomerTransactionRequestDto, decimal>' does not contain a definition for 'CustomCurrency' and the best extension method overload 'AuthValidatorSettings.CustomCurrency(IRuleBuilder<CustomerTransactionRequestDto, string>)' requires a receiver of type 'IRuleBuilder<CustomerTransactionRequestDto, string>'
Then it highlights:
RuleFor(p => p.Amount)
How do I get this sorted out?
Thank you
Solution 1:[1]
The error message hints that types don't match. You have a custom validator based on IRuleBuilder<T, string>
while you are trying to chain it to IRuleBuilderInitial<CustomerTransactionRequestDto, decimal>
. You have a custom validator based on string
property, while on the other end a decimal
property.
To fix this, change the type of Amount property from decimal
to string
:
public class CustomerTransactionRequestDto
{
public string Amount { get; set; }
}
That way, you can use the validators you already defined in CustomCurrency()
like Matches()
which are available for string
properties.
If decimal
property is not a mistake, then I'd suggest adding support for decimal
in CustomCurrency()
custom validator, like this:
public static IRuleBuilder<T, decimal> CustomCurrency<T>(this IRuleBuilder<T, decimal> ruleBuilder)
{
// TODO: Your validation.
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Prolog |