本例旨在说明我的一种Controller接收ajax提交(POST)过来的json对象或数组信息的方式,感觉应该有更好的方式,欢迎提出宝贵意见。
JSON.stringify(jsonObj)不支持IE8以下浏览器
前端页面代码如下:
1 <script type="text/javascript" src="~/Scripts/jquery-1.11.3.js"></script> 2 <form id="fm"> 3 <div> 4 <input id="btn" type="button" value="提交" onclick="SaveTest()" /> 5 </div> 6 </form> 7 <script> 8 function SaveTest() { 9 var jsonObj = []; 10 jsonObj.push({"id":1,"name":"123"}); 11 jsonObj.push({"id":2,"name":"234"}); 12 jsonObj.push({ "id": 3, "name": "345" }); 13 $.ajax({ 14 url: "/Test/Save", 15 type: "post", 16 dataType: "json", 17 async:false, 18 data: JSON.stringify(jsonObj), 19 success: function (data) { 20 21 }, 22 error: function (XMLHttpRequest, textStatus, errorThrown) { 23 alert(XMLHttpRequest.status); 24 alert(XMLHttpRequest.readyState); 25 alert(textStatus); 26 } 27 }); 28 } 29 </script>
Controller->Action代码如下(需引用System.IO和System.Web.Script.Serialization命名空间):
1 [HttpPost] 2 public ActionResult Save() 3 { 4 var sr = new StreamReader(Request.InputStream); 5 var stream = sr.ReadToEnd(); 6 JavaScriptSerializer js = new JavaScriptSerializer(); 7 var list = js.Deserialize<List<Models.SelectList>>(stream); 8 if (list.Any()) 9 { 10 foreach (var item in list) 11 { 12 13 } 14 } 15 return View(); 16 }
SelectList对象类(类这里可以加[Serializable]或者不加,因为没有直接传输或存储SelectList对象,所以我这里没有加)
1 public partial class SelectList 2 { 3 public int id { get; set; } 4 5 public string name { get; set; } 6 7 public string text { get; set; } 8 }
大体思路是将json对象或数组转换为字符串,由前端传入服务端,Request接收,然后使用json反序列化为实体对象。试过action直接加string参数,但进入action后,接收不到传过来的json字串。当然,也可以将json字串直接保存在隐藏域,form提交到服务端获取。