【发布时间】:2020-07-15 04:31:41
【问题描述】:
我正在使用 Fluent Validation 和 MVC 过滤器来验证请求。作为错误的一部分,我想显示一个有效值列表。我不确定如何让 ValidValues 属性填充有效值列表,就像验证过滤器填充 FieldName 和 Message 一样。
目前错误信息如下所示:
{
"errors": [
{
"fieldName": "Make",
"message": "Invalid Make"
}
]
}
我希望它显示如下内容:
{
"errors": [
{
"fieldName": "Make",
"message": "Invalid Make",
"validValues": ["Ford", "Honda"]
}
]
}
我的错误模型:
public class Error
{
public string FieldName { get; set; }
public string Message { get; set; }
public string[] ValidValues { get; set; }
}
验证器:
RuleFor(car => car.Make)
.Must(BeAValidMake)
.WithMessage("Invalid Make.");
//Add Valid values some how so they can be used by the validation filter to populate the error model.
验证过滤器:
public class ValidationFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
if (!context.ModelState.IsValid)
{
var errorsInModelState = context.ModelState
.Where(x => x.Value.Errors.Count > 0)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Errors.Select(e => e.ErrorMessage)).ToArray();
var errorResponse = new ErrorResponse();
foreach (var error in errorsInModelState)
{
foreach (var subError in error.Value)
{
var errorModel = new Error()
{
FieldName = error.Key,
Message = subError
};
errorResponse.Errors.Add(errorModel);
}
}
context.Result = new BadRequestObjectResult(errorResponse);
return;
}
await next();
}
}
【问题讨论】:
-
检查流利验证的这个状态属性,这可能有用docs.fluentvalidation.net/en/latest/custom-state.html
-
@MuhammadKamranAslam 这看起来很有希望,但你知道这个值是否可以从构建错误模型的 IAsyncActionFilter 中获得吗?
标签: c# asp.net-core fluentvalidation