jqgrid将JSON数据发布到POST请求缓冲区中
{"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 。
API/Entity/someid?culture=en&layout=1
headerData和rowData值属性是在运行时定义的,可以有所不同。
headerData
rowData
例如,在某些调用中,rowData可能包含其他属性,而某些rowData属性可能会丢失。
culture和layout查询字符串参数是可选的。
culture
layout
如何在WebAPI控制器中接收参数?
我试过了
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为空。如何获取所有参数?
有了这个功能,您就可以像在API / Entity / someid?culture = en&layout = 1这样的网址上发送您提供的正文一样。
要在控制器路由中指定可选的查询参数,请为它们提供一个默认值,例如 :
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;} }
并且可以让您完全接触到身体的任何元素。
这样的事情将允许接收任何一种json:
public HttpResponseMessage Post([FromBody]JToken body) { // Process the body return ... }
您将需要一些额外的验证,因为不会进行对象反序列化。您会知道的唯一想法是您的身体是JSON。
因此,您可能需要对其进行分析,以查看其外观是否符合您的期望。
例如,您可以执行以下操作来处理不断变化的正文内容,并仍然处理路线的可选查询参数:
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 ...; }
您还可以阅读此有关的原始数据发布到的WebAPI控制器的其他替代品。