c# - ASP.NET Core 2.1 [FromQuery] 没有获取参数

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

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

具体的 Action 是这样的:

[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 并且工作正常。

最佳答案

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

[HttpGet("GenerateCode/{email}]

如果这样做,您需要从 Controller 的 Route 属性中删除 /[action],所以它只是

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

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

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

并从 Controller 属性中删除 [Route("api/[controller]/[action]")] 并确保您没有 [ApiController] 属性之一

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

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

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

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

关于c# - ASP.NET Core 2.1 [FromQuery] 没有获取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51353999/

相关文章:

c# - 部分 View 未渲染且 Action 方法被调用两次

c# - 如何使用 RabbitMq 进行异步 RPC 调用

javascript - 错误时从 AJAX 调用重定向到 View

C# 正则表达式 : Combine a look ahead regex and a look behind regex into one

asp.net - *ngFor 未显示任何记录

c# - XML 阅读器性能

jquery - 动态部分 View + jquery 表单劫持 + 客户端验证 = 不起作用

asp.net - 如何为 Windows Azure 网站实现 "Site under maintenance"?

c# - 通过 C# 第四版的 CLR。 - 对等待任务死锁感到困惑

c# - 有没有办法让 C# 自定义属性在编译时引发消息?