我正在创建一个小应用程序来自学ASP.NET MVC和JQuery,其中一个页面是一个项目列表,其中一些可以选择.然后我想按下一个按钮并使用JQuery的Post函数向我的控制器发送一个List(或类似的东西),其中包含所选项目的ID.
我设法得到一个数组,其中包含所选元素的ID,现在我想发布它.我可以这样做的一种方法是在我的页面中有一个虚拟表单,带有隐藏值,然后使用所选项目设置隐藏值,并发布该表单; 不过,这看起来很狡猾.
有没有更简洁的方法来实现这一点,通过将阵列直接发送到控制器?我尝试了一些不同的东西,但看起来控制器无法映射它接收的数据.这是迄今为止的代码:
function generateList(selectedValues) { var s = { values: selectedValues //selectedValues is an array of string }; $.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json"); }
然后我的控制器看起来像这样
public ActionResult GenerateList(Listvalues) { //do something }
我设法获得的只是控制器参数中的"null"...
有小费吗?
我修改了我的回复以包含我所做的测试应用程序的代码.
更新:我已经更新了jQuery以将'traditional'设置为true,因此这将再次起作用(根据@DustinDavis的回答).
首先是javascript:
function test() { var stringArray = new Array(); stringArray[0] = "item1"; stringArray[1] = "item2"; stringArray[2] = "item3"; var postData = { values: stringArray }; $.ajax({ type: "POST", url: "/Home/SaveList", data: postData, success: function(data){ alert(data.Result); }, dataType: "json", traditional: true }); }
这是我的控制器类中的代码:
public JsonResult SaveList(Listvalues) { return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) }); }
当我调用那个javascript函数时,我会收到一条警告:"列表中的第一项:'item1'".希望这可以帮助!
仅供参考:JQuery改变了他们序列化发布数据的方式.
http://forum.jquery.com/topic/nested-param-serialization
另外,您必须将"传统"设置设置为true
{ Values : ["1", "2", "3"] }
会出来的
Values[]=1&Values[]=2&Values[]=3
代替
Values=1&Values=2&Values=3
谢谢大家的答案.另一个快速解决方案是使用传统参数设置为true的jQuery.param方法将JSON对象转换为字符串:
$.post("/your/url", $.param(yourJsonObject,true));
不要将数据作为数组发布. 要绑定到列表,应为每个键提交具有相同值的键/值对.
您不应该需要表单来执行此操作.您只需要一个键/值对列表,您可以在$ .post的调用中包含这些键/值对.
在.NET4.5
,MVC 5
使用Javascript:
JS中的对象:
发布的机制.
$('.button-green-large').click(function() { $.ajax({ url: 'Quote', type: "POST", dataType: "json", data: JSON.stringify(document.selectedProduct), contentType: 'application/json; charset=utf-8', }); });
C#
对象:
public class WillsQuoteViewModel { public string Product { get; set; } public ListClaimedFees { get; set; } } public partial class ClaimedFee //Generated by EF6 { public long Id { get; set; } public long JourneyId { get; set; } public string Title { get; set; } public decimal Net { get; set; } public decimal Vat { get; set; } public string Type { get; set; } public virtual Journey Journey { get; set; } }
控制器:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult Quote(WillsQuoteViewModel data) { .... }
收到的对象:
希望这能为您节省一些时间.