jqgrid在POST请求缓冲区中将json数据发布为
{"headerData": {
"Tasudok": "134",
"Kuupaev": "2015-11-23",
"Dokumnr": "135319"
},
"rowData": {
"Toode":"",
"Kogus":"0.0000",
"Nimetus":"öäölä<a",
"_rowsum":"0.00",
"Id":"1639",
"Dokumnr":"135319",
"_oper":"edit",
"_rowid":"1639"
}
}
数据使用
API/Entity/someid?culture=en&layout=1
之类的URL通过默认路由发布到ASP.NET MVC4 Web API。headerData
和rowData
值属性在运行时中定义,并且可以有所不同。例如,在某些调用中,rowData可能包含其他属性,而某些rowData属性可能会丢失。
culture
和layout
查询字符串参数是可选的。如何在WebAPI Controller 中接收参数?
我试过了
public class EntityController : APIController
{
public class PostParams {
public string culture { get; set; }
public int? layout { get; set; }
}
public HttpResponseMessage Post(string id,
[FromUri]PostParams optionalParams,
[FromBody]IList<NameValue> headerData,
[FromBody]IList<NameValue> rowData )
{ ... }
public class NameValue
{
public string name, value;
}
}
但是headerData和rowData为空。如何获取所有参数?
最佳答案
如果JSON的结构不变
有了这个,您就可以像在url这样提供的那样发送正文
API/Entity/someid?culture = zh-CN&layout = 1。
要在您的 Controller 路由中指定可选的查询参数,请为它们提供一个默认值,例如:
public class EntityController : APIController
{
public HttpResponseMessage Post([FromUri]string culture="EN", [FromUri]int layout=1, YourBody body )
{ ... }
}
如果YourBody始终像您提到的那样,则应自动反序列化以下内容:
public class YourBody
{
public Dictionary<string, string> HeaderData {get; set;}
public Dictionary<string, string> RowData{get; set;}
}
并且可以让您完全接触到 body 的任何元素。
JSON的结构是否可以更改
这样的事情将允许接收任何一种json:
public HttpResponseMessage Post([FromBody]JToken body)
{
// Process the body
return ...
}
您将需要一些额外的验证,因为不会进行对象反序列化。您会知道的唯一想法是您的 body 是JSON。
因此,您可能需要对其进行分析,以查看其外观是否符合您的期望。
参见that post about how to access element of a JSON with JToken。
例如,您可以执行以下操作来处理不断变化的正文内容,并仍然处理路线的可选查询参数:
public HttpResponseMessagePost([FromBody]JToken body, [FromUri]string culture="EN", [FromUri]int layout=1)
{
JObject headerData= body["headerData"].Value<JObject>();
JObject headerData= body["rowData"].Value<JObject>();
return ...;
}
您还可以阅读this,了解有关将原始数据发布到webapi Controller 的其他替代方法。
关于asp.net - 如何在Web API Controller 的Post方法中接收动态数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33924458/