【问题标题】:Passing Complex Object to .netcore1.1 Webapi though Query string通过查询字符串将复杂对象传递给.net core 1.1 Webapi
【发布时间】:2017-08-02 03:58:43
【问题描述】:

我试图通过查询字符串传递一个复杂的对象,但由于某种原因它不起作用。我有一个看起来像这样的复杂对象:

public class QueryOptions
{
    public QueryParameter[] Parameters = new QueryParameter[0];
}

我尝试了几种方式发送它,但没有任何效果:

我的 webapi 方法如下所示:

[HttpGet]
[AllowAnonymous]
public async Task<TDTO[]> GetList([FromQuery] QueryOptions queryOptions)
{
    return await this._service.GetList(queryOptions);
}

我尝试过使用和不使用 FromQuery 属性都不起作用。 url 查询如下所示:

/api/users?Parameters[0].PropertyName=FirstName&Parameters[0].Value=GTitzy&Parameters[0].FilterCondition=0

我也尝试过将对象的名称附加到开头。请求被发送,但 queryOptions 始终没有参数。

如何通过查询字符串传递这个复杂的对象?

【问题讨论】:

  • 不要。使用 body 和 form.post()。
  • 这是行不通的,GET 不应该用于发送复杂的对象。这似乎是XY problem。您要达到的最终目标是什么?
  • @Nkosi 我正在尝试允许对基本属性进行动态过滤,我正在尝试传递一个查询选项 dto 来过滤我的列表。我想使用 get,这样您就可以在将 URL 传递给用户时维护它
  • 如果我发帖认为用户将无法传递 URL 并且我不想使用 odata,我应该编写自定义模型绑定器还是您有什么想法
  • @johnny5 考虑到相关对象的复杂性,最好使用自定义模型绑定器

标签: c# asp.net-core query-string


【解决方案1】:

假设

public class QueryParameter {
    public string PropertyName { get; set; }
    public string Value { get; set; }
    public string FilterCondition { get; set; }
}

您需要更新您的模型以公开[FromQuery] 的公共属性,以便知道要绑定到什么。

public class QueryOptions {
    public QueryParameter[] Parameters { get; set; }
}

你也应该考虑阅读Model Binding: Customize model binding behavior with attributes

【讨论】:

  • 我忘了让我的班级使用属性!
  • @johnny5 您应该考虑寻找一种更简单的方法来传递您的查询选项。 IMO 这太复杂了
  • 是的,我一直在寻找一个好方法,但最终这样做是因为,这对我所有的 crud 实体都有效,它应用了通用过滤和搜索 api,而且我我在截止日期前加紧工作
猜你喜欢
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2011-01-31
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2021-09-07
相关资源
最近更新 更多