我找到了另一种解决方案,注入IActionContextAccessor
进入验证器。这样我就可以访问 ROUTE 参数,而不需要特殊的模型绑定。
启动.cs
services.AddHttpContextAccessor();
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
用户模型验证器.cs
public class UserModelValidator : AbstractValidator<UserModel>
{
public UserModelValidator(IActionContextAccessor actionContextAccessor)
{
RuleFor(item => item.Username)
.MustAsync(async (context, username, propertyValidatorContext, cancellationToken) =>
{
var userId = (string)actionContextAccessor.ActionContext.RouteData.Values
.Where(o => o.Key == "userId")
.Select(o => o.Value)
.FirstOrDefault();
return true;
});
}
}
2022 年更新 / FluentValidation 11
从 FluentValidation 11.0 开始,包含异步规则的验证器现在将抛出 AsyncValidatorInvokedSynchronouslyException
https://docs.fluidation.net/en/latest/upgrading-to-11.html#sync-over-async-now-throws-an-exception https://docs.fluentvalidation.net/en/latest/upgrading-to-11.html#sync-over-async-now-throws-an-exception
用户模型验证器.cs
public class UserModelValidator : AbstractValidator<UserModel>
{
public UserModelValidator(IActionContextAccessor actionContextAccessor)
{
RuleFor(item => item.Username)
.Must((context, username, propertyValidatorContext) =>
{
var userId = (string)actionContextAccessor.ActionContext.RouteData.Values
.GetValueOrDefault("userId");
return true;
});
}
}