Estou construindo uma API ASP.NET Core 9 Minimal em que o endpoint em que estou trabalhando está recebendo dados de formulário, mas não está conseguindo vincular o valor de uma das propriedades. A propriedade é uma estrutura id fortemente tipada (usando o pacote StronglyTypedId de Andrew Lock). O pacote gerou um TypeConverter
e um JsonConverter
, mas nenhum deles parece estar sendo usado para a vinculação do modelo.
Passei as últimas horas procurando uma solução e não cheguei a lugar nenhum, então vim aqui para perguntar se há algo específico que eu deva fazer para que a API Minimal modele a vinculação à estrutura?
Aqui está o código mais curto que consigo produzir para demonstrar o que quero dizer. Se eu passar um valor, ele será vinculado corretamente, mas se eu deixá-lo nulo, como o modelo define, recebo a seguinte exceção:
Microsoft.AspNetCore.Http.BadHttpRequestException: O valor '' não é válido para 'Id'.
[StronglyTypedId(Template.Int, TypedIds.Int, TypedIds.IntEfCore)]
public readonly partial struct TestId;
public static class DoSomething {
[ValidateNever]
public sealed class Command :
IRequest<CommandResponse> {
public TestId? Id { get; init; }
}
public sealed class CommandResponse;
}
file sealed class CommandHandler :
IRequestHandler<Command, CommandResponse> {
public Task<CommandResponse> Handle(
Command command,
CancellationToken cancellationToken) => Task.FromResult(new CommandResponse());
}
internal static class Endpoints {
private const string _tag = nameof(Optimize);
public static WebApplication MapOptimize(
this WebApplication app) {
app.MapPost("/v1/do-something", DoSomethingAsync)
.Accepts<DoSomethingCommand>("multipart/form-data")
.DisableAntiforgery()
.Produces<DoSomethingCommandResponse>()
.WithTags(_tag);
return app;
}
private static async Task<IResult> DoSomethingAsync(
[FromForm] DoSomethingCommand command,
[FromServices] IMediator mediator,
CancellationToken cancellationToken) {
var response = await mediator.Send(command, cancellationToken).ConfigureAwait(false);
return Results.Ok(response);
}
}