.Net Core 2.1 Проверка модели вне метода Validate (...) - PullRequest
0 голосов
/ 17 декабря 2018

Итак, я создаю API в .NET core 2.1 и хотел бы проверить модель, прежде чем она будет обновлена.Поэтому я решил внедрить IValidatableObject, который очень хорошо работает для простых моделей.

Однако теперь я хочу проверить формат запроса, отправленного мне разработчиком;то есть я хочу, чтобы мой валидатор не только проверял метод Validate, но и ловил ValidationResult объекты, которые могли быть получены в других местах объекта.

Мои классы:

public class Dad : IValidatableObject
{
    public long Id { get; set; }
    [Required]
    public Kid Kid { get; set; }

    public IEnumerable<ValidationResult> UpdateProperties(JObject props)
    {
        if (props["Kid"]["Id"] == null)
            yield return new ValidationResult("The correct format to set the Kid of Dad is {\"Kid\":{\"Id\":100}}");
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Kid.Height <= 170)
            yield return new ValidationResult("Kids need to be taller than 170.")
    }
}

public class Kid
{
    public long Id { get; set; }
    public int Height { get; set; } = 180;
}

Мой контроллер:

[HttpPatch("{id}")]
public async Task<IActionResult> PatchDad([FromRoute] long id, [FromBody] JObject props)
{
    Dad dad = _context.Dads.Find(id);

    dad.UpdateProperties(props);

    List<ValidationResult> Errors = new List<ValidationResult>();
    bool IsValid = Validator.TryValidateObject(dad, new ValidationContext(dad, serviceProvider: null, items: null), Errors);

    // I need the Validator to catch errors that occur in the Dad.UpdateProperties field !

    if (!IsValid)
        return BadRequestObjectResult(Errors);

        return NoContent();
    }

Отправка запроса PUT /Dad/19 с необработанными данными: {"KidId":100} должно привести к двум ошибкам;первый говорит, что формат параметра неверен, второй говорит, что требуется Kid.

1 Ответ

0 голосов
/ 17 декабря 2018

Хорошо, так - если вы, ребята, придумали что-нибудь лучше / чище, я был бы рад пометить это как ответ на этот вопрос, но в то же время, если кто-то еще попадает на эту страницу, я просто реализовалгрязное решение с использованием закрытого списка ValidationResult, который можно обновить из любого места:

public class Dad : IValidatableObject
{
    public long Id { get; set; }
    [Required]
    public Kid Kid { get; set; }

    [NotMapped, JsonIgnore]
    pricate List<ValidationResult> ValidationResults = new List<ValidationResult>();
    public void UpdateProperties(JObject props)
    {
        if (props["Kid"]["Id"] == null)
            ValidationResults.Add(new ValidationResult("The correct format to set the Kid of Dad is {\"Kid\":{\"Id\":100}}", new string[] { "Kid" }));
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Kid.Height <= 170)
            yield return new ValidationResult("Kids need to be taller than 170.")

        if (ValidationResults.Count > 0)
                foreach (ValidationResult r in ValidationResults)
                    yield return r;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...