Код: Выделить всё
public class MyModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext) {
var queryDto = bindingContext.ModelType.GetConstructors()[0].Invoke([]);
// fill properties via Reflection
bindingContext.Result = ModelBindingResult.Success(queryDto);
return Task.CompletedTask;
}
}
Код: Выделить всё
public class Dto {
public int Id { get; set; }
public string Name { get; set; }
}
Код: Выделить всё
app.MapGet("/get-dto", ([FromQuery] [ModelBinder(typeof(MyModelBinder))] Dto dto) => {
return CalculateResultSomehow(dot);
});
ошибка ASP0020: параметр «dto» типа Dto должен определять логическое значение TryParse(string, IFormatProvider, out Dto) или реализуйте IParsable
Если я удалю атрибут [FromQuery], лямбда выдаст предупреждение:
Атрибут ModelBinderAttribute не следует указывать для параметра MapGet Delegate
И код прерывается на время выполнения с исключением:
При обработке запроса произошло необработанное исключение.
InvalidOperationException: тело было выведено, но метод не допускает выводимые параметры тела. ...
Вы имели в виду зарегистрировать параметр(ы) «Body (Inferred)» как Службу или применить атрибут [FromServices] или [FromBody]?
Теперь, поскольку я реализую логику синтаксического анализа, основанную на Reflection, я не хочу реализовывать статический TryParse() для каждого отдельного DTO моего приложения (у меня их 100 ...). А мне не следует: у меня уже есть ModelBinder.
Действие контроллера прекрасно работает в той же системе:
Код: Выделить всё
[ApiController]
public class MyController
{
[HttpGet("/get-dto")]
public Dto GetDto([FromQuery] [ModelBinder(typeof(MyModelBinder))] Dto dto) {
return dto;
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... odelbinder