Минимальный API требует TryParse() для модели ввода, несмотря на ModelBinderC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Минимальный API требует TryParse() для модели ввода, несмотря на ModelBinder

Сообщение Anonymous »

Я пытаюсь реализовать один ModelBinder для всех моих DTO:

Код: Выделить всё

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;
}
}
Это пример DTO:

Код: Выделить всё

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;
}
}
Я здесь потерялся. Что мне не хватает? Почему это не работает для минимальных API?

Подробнее здесь: https://stackoverflow.com/questions/784 ... odelbinder
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»