我在尝试将复杂的JSON对象传递给MVC 4控制器操作时遇到麻烦。由于JSON内容是可变的,因此我不希望MVC将JSON的各个属性/元素映射到action方法的参数列表中的参数。我只想在控制器操作中将数据作为单个JSON字符串参数获取。
这是我的动作方法的签名:
[HttpPost] [ValidateInput(false)] public string ConvertLogInfoToXml(string jsonOfLog)
这是我尝试从浏览器发布一些JSON数据的尝试:
data = {prop: 1, myArray: [1, "two", 3]}; //'data' is much more complicated in my real application json = {jsonOfLog: data}; $.ajax({ type: 'POST', url: "Home/ConvertLogInfoToXml", data: JSON.stringify(json), success: function (returnPayload) { console && console.log ("request succeeded"); }, error: function (xhr, ajaxOptions, thrownError) { console && console.log ("request failed"); }, dataType: "xml", contentType: "application/json", processData: false, async: false });
当我在ConvertLogInfoToXML方法的开头击中断点时,jsonOfLog为null。
如果我更改JavaScript中设置的“ json”变量,以使jsonOfLog属性为简单字符串,例如:
json = { jsonOfLog: "simple string" };
然后,当我在ConvertLogInfoToXML方法开头的断点被击中时,jsonOfLog是字符串的值(例如“简单字符串”)。
我尝试将action方法中jsonOfLog参数的类型更改为object类型:
[HttpPost] [ValidateInput(false)] public string ConvertLogInfoToXml(object jsonOfLog)
现在,使用原始的JavaScript代码(我在其中传递了一个更复杂的“数据”对象),jsonOfLog获得了{object}的值。但是调试器不会在监视窗口中显示更多详细信息,并且我不知道可以使用什么方法对该变量进行操作。
如何将JSON数据传递到MVC控制器,其中传递的数据是字符串化的复杂对象?
谢谢,巴黎圣母院
问题是您dataType和您的data参数格式。我刚刚在沙盒中对此进行了测试,并且可以进行以下工作:
dataType
data
C#
[HttpPost] public string ConvertLogInfoToXml(string jsonOfLog) { return Convert.ToString(jsonOfLog); }
javascript
<input type="button" onclick="test()"/> <script type="text/javascript"> function test() { data = { prop: 1, myArray: [1, "two", 3] }; //'data' is much more complicated in my real application var jsonOfLog = JSON.stringify(data); $.ajax({ type: 'POST', dataType: 'text', url: "Home/ConvertLogInfoToXml", data: "jsonOfLog=" + jsonOfLog, success: function (returnPayload) { console && console.log("request succeeded"); }, error: function (xhr, ajaxOptions, thrownError) { console && console.log("request failed"); }, processData: false, async: false }); } </script>
请特别注意data,在发送文本时,您需要发送一个与参数名称匹配的变量。它不是很漂亮,但是它将为您提供令人垂涎的未格式化字符串。
运行此命令时,jsonOfLog在服务器函数中如下所示:
jsonOfLog "{\"prop\":1,\"myArray\":[1,\"two\",3]}" string
HTTP POST标头:
Key Value Request POST /Home/ConvertLogInfoToXml HTTP/1.1 Accept text/plain, */*; q=0.01 Content-Type application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With XMLHttpRequest Referer http://localhost:50189/ Accept-Language en-US Accept-Encoding gzip, deflate User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0) Host localhost:50189 Content-Length 42 DNT 1 Connection Keep-Alive Cache-Control no-cache Cookie EnableSSOUser=admin
HTTP POST正文:
jsonOfLog={"prop":1,"myArray":[1,"two",3]}
响应头:
Key Value Cache-Control private Content-Type text/html; charset=utf-8 Date Fri, 28 Jun 2013 18:49:24 GMT Response HTTP/1.1 200 OK Server Microsoft-IIS/8.0 X-AspNet-Version 4.0.30319 X-AspNetMvc-Version 4.0 X-Powered-By ASP.NET X-SourceFiles =?UTF-8?B?XFxwc2ZcaG9tZVxkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEyXFByb2plY3RzXE12YzRQbGF5Z3JvdW5kXE12YzRQbGF5Z3JvdW5kXEhvbWVcQ29udmVydExvZ0luZm9Ub1htbA==?=
响应主体:
{"prop":1,"myArray":[1,"two",3]}