Sieve icon indicating copy to clipboard operation
Sieve copied to clipboard

Sieve does not work with asp.net core minimal API's

Open klyse opened this issue 2 years ago • 4 comments

Describe the bug The new asp.net core minimal api's are not able to handle the SieveModel

To Reproduce Steps to reproduce the behaviour:

  • Create a new project and use the minimal API.
  • Map any Get request: app.MapGet("/test", ([FromQuery] SieveModel model) => { });
  • Start the app and make the first request to the /test endpoint

Expected behaviour The app starts and binds the SieveModel

Actual behvaiour Exception is thrown:

[11:00:53 ERR] An unhandled exception has occurred while executing the request. => Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware
System.InvalidOperationException: No public static bool SieveModel.TryParse(string, out SieveModel) method found for model.
   at Microsoft.AspNetCore.Http.RequestDelegateFactory.BindParameterFromValue(ParameterInfo parameter, Expression valueExpression, FactoryContext factoryContext, String source)
   at Microsoft.AspNetCore.Http.RequestDelegateFactory.CreateArgument(ParameterInfo parameter, FactoryContext factoryContext)
   at Microsoft.AspNetCore.Http.RequestDelegateFactory.CreateArguments(ParameterInfo[] parameters, FactoryContext factoryContext)
   at Microsoft.AspNetCore.Http.RequestDelegateFactory.CreateTargetableRequestDelegate(MethodInfo methodInfo, Expression targetExpression, FactoryContext factoryContext, Expression`1 targetFactory)
...

Desktop (please complete the following information):

  • OS: macos
  • dotnet 7.0.0-preview.7.22376.6

klyse avatar Aug 15 '22 09:08 klyse

I was able to reproduce the issue. Is there an update on this issue?

brianebeling avatar Sep 12 '22 02:09 brianebeling

Not to my knowledge. I worked around this problem by creating a wrapper class:

public class SieveWrapper
{
	[UsedImplicitly]
	[FromQuery]
	public string? Filters { get; set; }

	[UsedImplicitly]
	[FromQuery]
	public string? Sorts { get; set; }

	[UsedImplicitly]
	[FromQuery]
	public int? Page { get; set; }

	[UsedImplicitly]
	[FromQuery]
	public int? PageSize { get; set; }

	protected SieveModel GetSieve() => new()
	{
		Filters = Filters,
		Sorts = Sorts,
		Page = Page,
		PageSize = PageSize
	};
}

klyse avatar Sep 12 '22 06:09 klyse

Oh, that's smart. I tried writing a static extension method that would provide the missing TryParse. Unfortunately, .NET doesn't pick it up. I guess it was worth a try.

Now that I'm seeing your solution, I feel bad for not even thinking about just wrapping the class. Oof. Thanks for your response, I greatly appreciate a solution that doesn't require me to use FromBody haha

brianebeling avatar Sep 12 '22 06:09 brianebeling

As an update to this topic, starting with .NET version 7 preview 5, the [AsParameters] attribute can be passed in and the SieveModel works correctly in Minimal APIs.

image

joaquinalb avatar Mar 01 '24 19:03 joaquinalb