将对象列表传递给使用jQuery Ajax的MVC控制器方法
我想通过使用jQuery的ajax()函数传递一个对象数组到一个MVC控制器方法。 当我进入PassThing()C#控制器方法时,参数“things”为空。 我已经尝试过这种使用Listtypes的参数,但这也不起作用。 我究竟做错了什么?
<script type="text/javascript"> $(document).ready(function () { var things = [ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]; $.ajax({ contentType: 'application/json; charset=utf-8', dataType: 'json', type: 'POST', url: '/Xhr/ThingController/PassThing', data: JSON.stringify(things) }); }); </script> public class ThingController : Controller { public void PassThing(Thing[] things) { // do stuff with things here... } public class Thing { public int id { get; set; } public string color { get; set; } } }
使用NickW的build议,我能够得到这个工作使用things = JSON.stringify({ 'things': things });
这是完整的代码。
$(document).ready(function () { var things = [ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]; things = JSON.stringify({ 'things': things }); $.ajax({ contentType: 'application/json; charset=utf-8', dataType: 'json', type: 'POST', url: '/Home/PassThings', data: things, success: function () { $('#result').html('"PassThings()" successfully called.'); }, failure: function (response) { $('#result').html(response); } }); }); public void PassThings(List<Thing> things) { var t = things; } public class Thing { public int Id { get; set; } public string Color { get; set; } }
我从中学到了两件事情:1)contentType和dataType设置在ajax()函数中是绝对必要的。 如果他们失踪,这将无法正常工作。 经过多次尝试和错误,我发现了这一点。 2)要将一个对象数组传递给MVC控制器方法,只需使用JSON.stringify({'things':things})格式。
我希望这可以帮助别人!
你不能这样做吗?
var things = [ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]; $.post('@Url.Action("PassThings")', { things: things }, function () { $('#result').html('"PassThings()" successfully called.'); });
…并标记你的行动
[HttpPost] public void PassThings(IEnumerable<Thing> things) { // do stuff with things here... }
格式化您的数据可能是问题。 尝试以下任一方法:
data: '{ "things":' + JSON.stringify(things) + '}',
或者(从我怎么能没有一个表单的string数组发布到ASP.NET MVC控制器? )
var postData = { things: things }; ... data = postData
我对这一切有完美的回答:我尝试了很多解决scheme,终于没有办法让自己能够pipe理,请在下面find详细的答案:
$.ajax({ traditional: true, url: "/Conroller/MethodTest", type: "POST", contentType: "application/json; charset=utf-8", data:JSON.stringify( [ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]), success: function (data) { $scope.DisplayError(data.requestStatus); } });
的Controler
public class Thing { public int id { get; set; } public string color { get; set; } } public JsonResult MethodTest(IEnumerable<Thing> datav) { //now datav is having all your values }
这是您查询的工作代码,您可以使用它。
的Controler
[HttpPost] public ActionResult save(List<ListName> listObject) { //operation return Json(new { istObject }, JsonRequestBehavior.AllowGet); } }
JavaScript的
$("#btnSubmit").click(function () { var myColumnDefs = []; $('input[type=checkbox]').each(function () { if (this.checked) { myColumnDefs.push({ 'Status': true, 'ID': $(this).data('id') }) } else { myColumnDefs.push({ 'Status': false, 'ID': $(this).data('id') }) } }); var data1 = { 'listObject': myColumnDefs}; var data = JSON.stringify(data1) $.ajax({ type: 'post', url: '/Controller/action', data:data , contentType: 'application/json; charset=utf-8', success: function (response) { //do your actions }, error: function (response) { alert("error occured"); } });
var List = @Html.Raw(Json.Encode(Model)); $.ajax({ type: 'post', url: '/Controller/action', data:JSON.stringify({ 'item': List}), contentType: 'application/json; charset=utf-8', success: function (response) { //do your actions }, error: function (response) { alert("error occured"); } });
唯一的办法,我可以得到这个工作是传递JSON作为一个string,然后使用JavaScriptSerializer.Deserialize<T>(string input)
反序列化,这是很奇怪,如果这是MVC 4的默认解串器。
我的模型嵌套了对象列表,最好的我可以得到使用JSON数据是最上面的列表中有正确数量的项目,但项目中的所有字段为空。
这种事情不应该这么难。
$.ajax({ type: 'POST', url: '/Agri/Map/SaveSelfValuation', data: { json: JSON.stringify(model) }, dataType: 'text', success: function (data) { [HttpPost] public JsonResult DoSomething(string json) { var model = new JavaScriptSerializer().Deserialize<Valuation>(json);
如果您使用ASP.NET Web API,那么您应该只传递data: JSON.stringify(things)
。
你的控制器应该是这样的:
public class PassThingsController : ApiController { public HttpResponseMessage Post(List<Thing> things) { // code } }
从@veeresh修改i
var data=[ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]; //parameter var para={}; para.datav=data; //datav from View $.ajax({ traditional: true, url: "/Conroller/MethodTest", type: "POST", contentType: "application/json; charset=utf-8", data:para, success: function (data) { $scope.DisplayError(data.requestStatus); } }); In MVC public class Thing { public int id { get; set; } public string color { get; set; } } public JsonResult MethodTest(IEnumerable<Thing> datav) { //now datav is having all your values }
用包含与MVC控制器所期望的参数名称相匹配的属性的另一个对象包装对象列表。 重要的是围绕对象列表的包装。
$(document).ready(function () { var employeeList = [ { id: 1, name: 'Bob' }, { id: 2, name: 'John' }, { id: 3, name: 'Tom' } ]; var Employees = { EmployeeList: employeeList } $.ajax({ dataType: 'json', type: 'POST', url: '/Employees/Process', data: Employees, success: function () { $('#InfoPanel').html('It worked!'); }, failure: function (response) { $('#InfoPanel').html(response); } }); }); public void Process(List<Employee> EmployeeList) { var emps = EmployeeList; } public class Employee { public int Id { get; set; } public string Name { get; set; } }