FluentValidator 和 JsonPatchDocument

Ole*_* Sh 6 patch fluentvalidation json-patch asp.net-core-2.0

我有 WebAPI (.NET Core) 并用于FluentValidator验证模型,包括更新。我使用 PATCH 动词并有以下方法:

    public IActionResult Update(int id, [FromBody] JsonPatchDocument<TollUpdateAPI> jsonPatchDocument)
    {
Run Code Online (Sandbox Code Playgroud)

另外,我有一validator堂课:

public class TollUpdateFluentValidator : AbstractValidator<TollUpdateAPI>
{
    public TollUpdateFluentValidator ()
    {
        RuleFor(d => d.Date)
            .NotNull().WithMessage("Date is required");

        RuleFor(d => d.DriverId)
            .GreaterThan(0).WithMessage("Invalid DriverId");

        RuleFor(d => d.Amount)
            .NotNull().WithMessage("Amount is required");

        RuleFor(d => d.Amount)
            .GreaterThanOrEqualTo(0).WithMessage("Invalid Amount");
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其映射到类validatorStartup

        services.AddTransient<IValidator<TollUpdateAPI>, TollUpdateFluentValidator>();
Run Code Online (Sandbox Code Playgroud)

但它不起作用。如何编写FluentValidator对我的任务有效的内容?

Sta*_*ked 2

您将需要手动触发验证。您的操作方法将与此类似:

public IActionResult Update(int id, [FromBody] JsonPatchDocument<TollUpdateAPI> jsonPatchDocument)
{
    // Load your db entity
    var myDbEntity = myService.LoadEntityFromDb(id);

    // Copy/Map data to the entity to patch using AutoMapper for example
    var entityToPatch = myMapper.Map<TollUpdateAPI>(myDbEntity);

    // Apply the patch to the entity to patch
    jsonPatchDocument.ApplyTo(entityToPatch);

    // Trigger validation manually
    var validationResult = new TollUpdateFluentValidator().Validate(entityToPatch);
    if (!validationResult.IsValid)
    {
        // Add validation errors to ModelState
        foreach (var error in validationResult.Errors)
        {
            ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
        }

        // Patch failed, return 422 result
        return UnprocessableEntity(ModelState);
    }

    // Map the patch to the dbEntity
    myMapper.Map(entityToPatch, myDbEntity);
    myService.SaveChangesToDb();

    // So far so good, patch done
    return NoContent();
}
Run Code Online (Sandbox Code Playgroud)