【问题标题】:Posting to .NET Core Web API Controller without model binding在没有模型绑定的情况下发布到 .NET Core Web API 控制器
【发布时间】:2020-06-28 07:24:21
【问题描述】:

服务器端

public void Post(int clientID, string name, string gender)  // Currently, it is bound from querystring by default
{
    Console.WriteLine(clientID);
    Console.WriteLine(name);
    Console.WriteLine(gender);
}

客户端

  return jQuery.ajax({
    'type': 'POST',
    'url': url,
    'contentType': 'application/json; charset=utf-8',
    'data': '{ "clientID": 123, "name": "foo", "gender": "M" }',
    'dataType': 'json'
  });

.NET Core Web API 鼓励开发者采用模型进行模型绑定。但是,对我来说,我认为在某些情况下这很烦人。即我需要为每个 POST 请求创建一个模型。

我知道我可以使用JsonElement[FromBody] 来包含传入的参数,但是在尝试使用JsonElement 进行操作之后,似乎使用起来不太方便。 (对比JObject/JArray

我可以知道是否有一种方便的方法可以在没有模型绑定器的情况下获取我的参数?或者我可以使用NewtonsoftJObject 包含参数吗?任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 只使用查询字符串。

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


【解决方案1】:

为什么要发帖?

使用 GET 执行此操作,并将参数放在查询字符串上,查询字符串将映射到 WebMethod 中的参数:

$.getJSON(url, { clientID: 1, name: "Jeremy", gender: "Male"} ) function(data) {

}

否则,如果它必须是一个 POST 使用一个模型,它还不错。专业提示使用 JSON 到 C# 转换服务为您制作类,即将这个 JSON { clientID: 1, name: "Jeremy", gender: "Male"} 复制到 https://json2csharp.com/

参考:https://www.youtube.com/watch?v=HW7QmYWMnqE

【讨论】:

  • QueryString 有长度限制,在某些情况下可能会太长。例如base64 img
  • 很公平,然后回到 POST,它的主体旨在成为 .net 核心中的序列化对象。序列化的好处是它在一定程度上支持向后兼容。然而,如果你有一个路由路径或不同数量的参数,你添加一个新的,它就会不同步,你不能在不破坏旧版本的情况下适应新的。具有自动 JSON 反序列化的单个模型绑定参数减轻了负担,并且专门为此而设计。而且它更好。
【解决方案2】:

首先,除了您的实际问题之外,您永远不应该懒惰地为良好的代码设计创建新类。即使对于方法的一些简单参数,也要始终创建模型。有时我什至不在乎它是否只需要一个参数,除非它类似于 id 方法或排序的 id 参数。不要为此偷懒,因为编码良好的应用程序的品质之一对未来的变化更加开放,对它们进行更少的代码修改。今天看起来这个方法对你来说只需要 3 个参数,为什么还要为此创建一个全新的类,对吧?但事情总是在变化,它永远不会保持不变。多年来我有/有队友做同样的事情,相信我,这些方法总是随着时间的推移添加新的和新的参数,最终看起来很丑陋且难以阅读。而如果你决定稍后将这些参数更改为模型,那将带来太多的工作,因为你也必须在方法内部进行更改。

回到你的问题;

是的,不幸的是,最简单的解决方案是使用[FromBody]JObject 作为参数。但既然你必须像类一样使用它,更糟糕的是,像字典一样使用它,为什么不创建自己的类呢?

另一种解决方案是,在正文中发布空数据,但在 query string 中传递这些参数。

另一个正在编写你自己的模型绑定器 (IModelBinder) 并在你的方法上使用它的属性,就像这些人对 JsonParametersModelBinder 所做的那样主要使用参数。

【讨论】:

  • 我试过 JObject。但是,它提示我错误。 .NET Core Web API 不知道如何将JsonElement 转换为JObject
  • 然后使用 JsonElement 代替?
猜你喜欢
  • 2017-12-18
  • 1970-01-01
  • 2017-09-08
  • 2021-06-30
  • 2020-09-09
  • 1970-01-01
  • 2021-07-15
  • 2018-04-22
  • 1970-01-01
相关资源
最近更新 更多