发布到 .NET Core Web API 控制器,无需模型绑定



服务器端

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 请求创建一个模型。

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

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

为什么开机自检?

使用 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

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

回到你的问题;

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

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

另一个是编写你自己的模型绑定器(IModelBinder(,并在你的方法上用一个属性使用它,就像这些人对JsonParametersModelBinder所做的那样,一开始可能工作量太大,但如果你打算主要使用参数,它是可重用的。

最新更新