簡體   English   中英

ASP.NET Core 2.1 [FromQuery] 未獲取參數

[英]ASP.NET Core 2.1 [FromQuery] not getting param

我正在嘗試使用 ASP.NET Core 2.1 從使用[FromQuery]的查詢參數獲取我的 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始終為空,我在函數中放置了一個斷點,所以我知道它被調用了。

我發送的請求是這樣的:

{{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}]

如果這樣做,您將需要從控制器的 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

回答有點晚,但可能對其他人有幫助

選項 4

您可以在 [FromQuery] 屬性中顯式命名查詢字符串參數名稱

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM