【问题标题】:.Net Core API - Mixed Model Binding not working.Net Core API - 混合模型绑定不起作用
【发布时间】:2020-01-26 04:49:43
【问题描述】:

使用的框架是 .Net Core 3.0,但在 2.2 中测试并获得了相同的行为。

我正在使用一个类来自动绑定正文请求属性,并且效果很好,即使它们没有 [FromBody] 属性。

现在,我在这个类中添加了一个新属性,它将匹配标头中的一个属性,如果我直接在控制器中使用它,它就可以工作,如下所示:

public IActionResult Test(TestRequest request, [FromHeader(Name = "Authorization")] string token)

但是,当我尝试通过将 [FromHeader] 属性添加到类属性中来获得相同的结果时,它不起作用。

这里有一个示例代码来说明这个问题:

[ApiController]
[Route("api")]
public class TestController : ControllerBase
{
    [HttpPost]
    [Route("Test")]
    public IActionResult Test(TestRequest request)
    {
        Console.WriteLine("request.UserId: " + request.UserId);
        Console.WriteLine("request.Token: " + request.Token);
        return Ok();
    }
}
public class TestRequest
{
    [FromBody]
    public string UserId { get; set; }

    [FromHeader(Name = "Authorization")]
    public string Token { get; set; }
}

有人遇到过同样的问题吗?

【问题讨论】:

  • 你能解开困惑吗,你说在这个类中添加了一个新属性,它将匹配标题中的一个属性,如果我直接在控制器中使用它,它就可以工作,像这样 然后说 我尝试通过将 [FromHeader] 属性添加到类属性中来获得相同的结果,但它不起作用。 - 但在这两种情况下,您都显示相同代码
  • 您是否尝试删除[FromHeader(Name = "Authorization")] string token
  • @JeremyThompson 当然,完整的代码包含两种方法,在控制器和类中使用 FromHeader 属性。这样您就可以看到一个有效的(控制器)和一个无效的(类)。请看我发布的图片以查看结果!
  • @ChetanRanpariya 是的,实际上正如我刚刚向 Jeremy 提到的,这是包含这两种方法的完整代码。我尝试只使用其中一个和两个,但只有一个控制器有效。
  • @LeandroBremer 你有机会查看参考Model Binding in ASP.NET Core

标签: c# asp.net asp.net-core .net-core core-api


【解决方案1】:

您需要在 Startup.cs 的 ConfigureServices 中将 SuppressInferBindingSourcesForParameters 配置为 true,如下所示:

services.AddMvc().ConfigureApiBehaviorOptions(options =>
        {
            options.SuppressInferBindingSourcesForParameters = true;
        });

行动:

[HttpPost]
[Route("Test")]
public IActionResult Test(TestRequest request)

并使用您的Authorization 标头(未在下面显示)和正文字符串调用 api,供邮递员使用

更新:

由于您在字符串属性上使用[FromBody],它接受字符串而不是json对象。

如果您仍想将 json 对象作为{ "userId" : "123" } 传递,您可以将 userId 变形为模型,例如:

public class User
{
    public string UserId { get; set; }
}
public class TestRequest
{
    [FromBody]
    public User User { get; set; }

    [FromHeader(Name = "Authorization")]
    public string Token { get; set; }
}

【讨论】:

  • 成功了!!!但是,我的 Json 请求停止工作。我收到了一个错误的请求,需要更改正文请求格式,不包括括号和参数名称...从这个{ "userId" : "123" } 到这个"123" ...=/ ...你知道是否有办法保持相同的格式工作?我正在使用 .Net Core 3.0
  • @Leandro Bremer 那是因为你在属性上添加了[FromBody],所以你需要传递一个字符串而不是一个对象。参考github.com/aspnet/AspNetCore.Docs/issues/11699
  • @Leandro Bremer 如果您想将其作为对象传递,那么您需要将 userId 包装到视图模型中。请参阅我的更新。
  • @Leandro Bremer 如果您解决了问题,您能接受答案吗?谢谢!
  • 工作正常!!我将不得不在这里更改我的代码,但是,它将是真正结构化的!谢谢你,伙计!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 2017-12-18
  • 1970-01-01
相关资源
最近更新 更多