【问题标题】:How to pass a complex C# object using FromQuery如何使用 FromQuery 传递复杂的 C# 对象
【发布时间】:2019-08-26 11:32:21
【问题描述】:

在我的客户端代码中,我有一个这样的对象:

{
  "selectedItems": [
    4016,
    3937
  ],
  "selectedStatuses": [],
  "search": "foo"
}

我想映射到 C# DTO

public class FilterModel
{
    public List<int> SelectedItems { get; set; }
    public List<int> SelectedStatuses { get; set; }
    public string Search { get; set; }
}

但它用于 GET 查询,所以我不能通过 FromBody 仅通过 FromQuery 传递它。控制器动作中已经有了基本参数:

[HttpGet("{id}/filter/{typeId}")]
public async Task<IActionResult> GetFilteredData([FromRoute]int id, 
    [FromRoute]int typeId,
    [FromQuery]FilterModel filters = null)

客户端,我在 Angular 中使用 $http 构建这个查询。如何设置我的 $http 调用以将我的过滤器对象创建为查询字符串?

【问题讨论】:

    标签: c# angularjs asp.net-mvc asp.net-core


    【解决方案1】:

    简单地说,您的查询名称需要与发布的输入名称相同,即filters.SelectedItems[](对列表中的每个项目重复)、filters.SelectedStatuses[](对列表中的每个项目重复)和filters.Search。例如:

    ?filters.SelectedItems[]=item1&filters.SelectedItems[]=item2&filters.SelectedItems[]=item3&filters.SelectedStatuses[]=status1&filters.SelectedStatuses[]=status2&filters.SelectedStatuses[]=status3&filters.Search=keyword
    

    注意:这里有相当大的余地,但最终,您将达到最大请求长度限制。在大多数情况下,您应该没有任何问题,但如果您开始选择 100 多种东西,您可能需要一个不同的计划。

    FWIW,您始终可以只使用帖子,特别是如果您通过 AJAX 执行此操作,因为无论哪种方式,它对用户都是无缝的。

    【讨论】:

    • 是的,但filters.SelectedJobs[],不仅仅是selectedJobs。您需要完全匹配参数和属性名称,否则它不会绑定。
    • 是的,对不起。更新答案时删除了我的查询。谢谢。
    • 这是我发现有用的相关来源:hanselman.com/blog/…
    【解决方案2】:

    如果你使用的是ajax,一个简单的方法是添加traditional:true以使用传统的param序列化样式。参考here

    var data =
            {
                "selectedItems": [
                    4016,
                    3937
                ],
                "selectedStatuses": [12, 34],
                "search": "foo"
            };
            $.ajax({
                url: "your url", //directly like /Home/{id}/filter/{typeId}              
                type: 'GET',
                data: data,
                traditional: true,
                success: function (result) {
    
                }
            });
    

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      相关资源
      最近更新 更多