【问题标题】:Pass custom object as parameter to controller将自定义对象作为参数传递给控制器
【发布时间】:2020-10-07 14:51:29
【问题描述】:

我是 ASP Net Core 的新手。我在这个框架中制作的 API Rest 中制作了一些基本的 CRUD。现在我必须创建一个可以接收 3 个或更少属性的新端点。属性 1、属性 2、属性 3。根据我到目前为止的工作方式,控制器必须接收对象作为参数,但在这种情况下,没有实体或 DTO 具有此属性。我用字典做的,是这样的:

[HttpPost]
public async Task<IActionResult> Add(Dictionary<string, dynamic> parameters)
{
    var Respuesta =  _prLiquidacionesService.Liquidar(parameters);
    return Ok(Respuesta);
}

但我不知道这是否是最好的方法。也许更好地定义一个名为 LiquidacionRequest 的请求实体并在那里定义我需要的属性?

请您给我您的意见吗?

【问题讨论】:

  • 有一个FromBody attribute 可能会在附加到您的parameters 参数时有所帮助。

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


【解决方案1】:

更新答案

您可以使用带有Dictionary 的模型绑定,只需将查询字符串设为以下格式:

来自查询

https://Example.com/Controller/Action?parameters[key]=value1&parameters[key2]=value2&parameters[key3]=value3

从正文

老实说,如果没有自定义模型绑定器,我无法使其与 Dictionary 一起工作,但有一个适当的替代品 List&lt;KeyValuePair&lt;string, dynamic&gt;&gt; 可以公开类似的 API。

Json 数据样本:

[
    {
        "Key": "asd",
        "Value": 123
    },
    {
        "Key": "dsa",
        "Value": 321
    }
]

行动:

[HttpPost]
public async Task<IActionResult> Add([FromBody] List<KeyValuePair<string, dynamic>> parameters)
{
    var Respuesta =  _prLiquidacionesService.Liquidar(parameters);
    return Ok(Respuesta);
}

如果您的方法需要Dictionary,那么一个简单的演员就可以完成这项工作:

parameters.ToDictionary(x => x.Key, x => x.Value);

有关更多示例,请参阅文档。 MSDN Model Binding

【讨论】:

  • 通过查询字符串而不是正文传递参数有什么好处?
  • @ЯрославВиталиевич 这是一个选择问题以及如何配置操作以接收信息,我只是通过查询字符串提供了一个示例,因为 op 表示该操作将接收 3 个或更少的属性。对于更复杂的数据,我通常使用 body。
  • 感谢您的解释。 IMO,通过查询传递参数有几个缺点,这就是我问的原因。 1) 查询的大小有限,2) 查询参数不安全,因为它存储在浏览器历史记录中。 3)查询主要用于过滤而不是用于传递数据。
  • 是的,想法是通过body传递参数。
  • @user2048789 更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多