C# 将查询和标头参数绑定到同一模型

C# 将查询和标头参数绑定到同一模型,c#,asp.net,asp.net-core,asp.net-web-api,model-binding,C#,Asp.net,Asp.net Core,Asp.net Web Api,Model Binding,我正在尝试将查询和标题参数从控制器操作绑定到单个模型: 请求模型: 公共类MyRequest { [FromQuery] 公共字符串查询参数{get;set;} [FromHeader] 公共字符串头参数{get;set;} } 控制器操作: [HttpGet] 公共操作结果操作(MyRequest MyRequest) { ... } 这方面的问题在于: Swagger请求输入json: 即使我尝试curl此端点,也会得到“不支持的媒体类型” 但是,如果我只是在控制器的操作中添加[From

我正在尝试将查询和标题参数从控制器操作绑定到单个模型:

请求模型:

公共类MyRequest
{
[FromQuery]
公共字符串查询参数{get;set;}
[FromHeader]
公共字符串头参数{get;set;}
}
控制器操作:

[HttpGet]
公共操作结果操作(MyRequest MyRequest)
{
...
}
这方面的问题在于:

  • Swagger请求输入json:
  • 即使我尝试
    curl
    此端点,也会得到“不支持的媒体类型”
  • 但是,如果我只是在控制器的操作中添加[FromQuery]:

    public ActionResult FooAction([FromQuery]MyRequest MyRequest)
    
    然后它就如预期的那样工作了。这方面的问题是——不太清楚:“如果有FromHeader字段,为什么要添加FromQuery?”


    我可以创建两个单独的模型,一个用于查询参数,另一个用于标题参数,但我真的很想找到一种方法将它们都放在同一个模型中。

    我建议您阅读相关内容,或者直接转到第节

    以下是关于模型绑定源的摘要:

    默认情况下,模型绑定以键值对的形式从HTTP请求中的以下来源获取数据:表单字段请求主体(对于APIController),路由数据查询字符串参数上载文件

    如果默认源不正确,请使用以下属性之一指定源:
    [FromQuery]
    [FromRoute]
    [FromFrom]
    [FromBody]
    [FromHeader]
    重要提示:这些属性分别添加到模型属性中(而不是添加到模型类中)

    然后,以下代码将适用于您:

    public IActionResult FooAction(MyRequest myRequest)
    {
        return new JsonResult(myRequest);
    }
    
    public class MyRequest
    {
        public string QueryParameter { get; set; }
    
        [FromHeader]
        public string HeaderParameter { get; set; }
    }
    

    首先,如果要将数据绑定到
    HttpGet
    中的对象,必须使用
    [FromQuery]
    ,否则它将不会绑定到对象。如果数据是
    string myRequest
    而不是
    myRequest myRequest
    ,则不需要添加“[FromQuery]”

    否则,如果使用HttpPost,它也不需要“[FromQuery]”:

    控制器:

    [HttpPost("FooAction")]
            public ActionResult FooAction(MyRequest myRequest)
            {
                return Ok();
            }
    
    结果:

    您如何发送请求?HttpGet还是HttpPost?@SelimYıldız这是一个Get你刚刚从问题中复制粘贴了我的代码,从我看到的。至少在默认情况下,它不起作用。你试过了吗?我已经创建了一个单独的控制器,复制粘贴了您的代码,并且得到了不受支持的媒体类型(如我问题中描述的错误)。基本上,您的意思是,对于HttpGet,我需要添加
    [FromQuery]MyRequest
    ,才能使它正常工作,对吗?这就是我的全部问题:我不想将FromQuery用于具有FromQuery和FromHeader的模型。有办法绕过它吗?
    [HttpPost("FooAction")]
            public ActionResult FooAction(MyRequest myRequest)
            {
                return Ok();
            }