ASP.NET Core 2.1 [FromQuery]无法获取参数

时间:2018-07-16 02:54:12

标签: c# asp.net asp.net-mvc asp.net-web-api asp.net-core-2.1

我正在尝试使用[FromQuery]通过ASP.NET Core 2.1从查询参数中获取WebAPI的参数。对于我的一生,我无法弄清楚自己在做错什么。

特定操作如下:

[Route("api/[controller]/[action]")]
public class AuthController : Controller
{
    [HttpGet]
    [Authorize(Roles = "admin")]
    public async Task<IActionResult> GenerateCode([FromQuery]string email)
    {
        if (String.IsNullOrEmpty(email))
            return new BadRequestObjectResult(new ApiBadRequestResponse(new string[] { "Email is empty." }));

        var result = await _mediator.Send(new CreateAccessCode.Command
        {
            Email = email
        });

        if (result.Succeeded)
            return new OkObjectResult(new ApiOkResponse(result.Data));

        return new BadRequestObjectResult(new ApiBadRequestResponse(result.Errors));
    }
}

email始终为null,我在函数中放置了一个断点,所以我知道它会被调用。

我发送的请求是这样的:

{{url}}/api/auth/generatecode?email=test

如果我从头开始创建一个新项目,[FromQuery]似乎可以正常工作,我不知道我在做些什么。该操作正在被调用,但由于第一行而总是返回BadResponse ...

我的startup.cs函数看起来像这样:

services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
            .AddMvcOptions(options =>
            {
                options.Filters.Add(new ActionValidationFilter());
            })
            .AddFluentValidation()
            .AddJsonOptions(options =>
            {
                options.SerializerSettings.ContractResolver =
                new CamelCasePropertyNamesContractResolver();
            })
            .AddSessionStateTempDataProvider();

我完全迷路了。这是我在WebAPI中要查找查询参数的第一个操作。所有其他操作都使用FromBody并正常工作。

2 个答案:

答案 0 :(得分:4)

选项1)
尝试将您的[HttpGet]属性更改为

[HttpGet("GenerateCode/{email}]

如果这样做,您将需要从控制器的Route属性中删除/[action],因此就可以了

[Route("api/[controller]")]

选项2)
或者,在Startup.cs中将app.UseMvc();更改为

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "api/{controller=Home}/{action=Index}/{id?}");
});

然后从控制器属性中删除[Route("api/[controller]/[action]")],并确保您也没有[ApiController]属性

此解决方案将更改整个项目的路由,因此您必须对所有其他API控制器执行相同的操作

选项3)
第三种解决方案是将[Route("api/[controller]/[action]")]更改为

[Route("api/[controller]/[action]/{id?}")]

我已经测试了所有3个解决方案,它们都带有URL {{url}}/api/ControllerName/ActionName?email=test

答案 1 :(得分:1)

答案稍晚,但可能对其他人有帮助

选项4

您可以在[FromQuery]属性中明确命名querystring参数名称

[HttpGet]
[Authorize(Roles = "admin")]
public async Task<IActionResult> GenerateCode([FromQuery(Name="email")] string email)
{

}