【问题标题】:JSON data to MVC controller actionresultJSON 数据到 MVC 控制器操作结果
【发布时间】:2016-02-08 22:06:15
【问题描述】:

我的 Jquery 代码创建了三个对象,然后将它们放在另一个对象中,该对象使用 JSON.stringify 发布到控制器中的操作。

动作中的字符串如下所示:

{"sources":{"0":{"Name":"aaaaa","IP":"1.1.1.1","Username":"vvvv"},"1":{"Name":"bbbb","IP":"2.2.2.2","Username":"fdfdfdf"}},"destinations":{"0":{"Name":"aaaaa","IP":"1.1.1.1"},"1":{"Name":"bbbb","IP":"2.2.2.2"}},"protocols":{"0":{"Name":"dsfsdfsdf","Type":"FTP,SSH","Port":"22,33"}},"remarks":"sdfsdfsdf"}

所以这三个对象是:

var sources = {};
var destinations = {};
var protocols = {};

充满:

sources[iS] = { 'Name': field1, 'IP': field2, 'Username': field3 };

(iS 是一个计数器)

destinations[iD] = { 'Name': field1, 'IP': field2 };

(iD 是一个计数器)

protocols[iP] = { 'Name': field1, 'Type': field2, 'Port': field3 }

(iP 是一个计数器)

它们被放在一起:

var remarks = $('#txtRemarks').val();
var postdata = { "sources": sources, "destinations": destinations, "protocols": protocols, "remarks": remarks };

然后发布:

$.ajax({
  url: ThisController + '/AddRule',
  type: 'POST',
  data: 'postdata='+JSON.stringify(postdata),
  dataType: 'json',
  traditional: true,
  success: function (data) {
    $('#pnDataCollection').html(data);
  });

并收到:

 [HttpPost]
 public ActionResult AddRule(string postdata)  
 {

   return HttpNotFound();
 }

我有三个班级:

public class Source
{
  public string Name { get; set; }
  public string IP { get; set; }
  public string UserName { get; set; }
}

public class Destination
{
  public string Name { get; set; }
  public string IP { get; set; }
}

public class Protocol
{
  public string Name { get; set; }
  public string Type { get; set; }
  public string Port { get; set; }
}

我怎样才能将 JSON 字符串中的三个对象变为:

List<Source> = DoSomeThingWith(JsonString for Sources)
List<Destination> = DoSomeThingWith(JsonString for Destinations)
List<Protocol> = DoSomeThingWith(JsonString for Protocols)

??

【问题讨论】:

  • 您的代码中没有数组,只有对象!
  • 谢谢,更新了问题。
  • 显示您发布到的方法的签名。如果您想绑定到IEnumerable&lt;Source&gt;,那么您确实需要一个数组 - [{"Name":"aaaaa","IP":"1.1.1.1" ...}, {"Name":"bbbb","IP":"2.2.2.2"}]
  • 我已经添加了方法。还不算多。
  • 现在没时间,但我会在大约 45 分钟后添加答案

标签: jquery arrays json asp.net-mvc


【解决方案1】:

您的代码建议您回发 3 个集合和其中一个表单控件的值,因此您的控制器方法需要是

[HttpPost]
public ActionResult AddRule(List<Source> sources, List<Destination> destinations, List<Protocol> protocols, string remarks)

但是你发回的json和你需要的没有关系,你需要生成集合。

var sources = [];
var destinations  = [];
var protocols = [];
// add some objects
sources.push({"Name":"aaaaa","IP":"1.1.1.1","Username":"vvvv"});
sources.push({"Name":"bbbb","IP":"2.2.2.2","Username":"fdfdfdf"});
// ditto for destinations and protocols
var data = { source: sources, destinations: destinations, protocols: protocols, remarks: $('#txtRemarks').val() };

$.ajax({
  url: '@Url.Action("AddRule")'; // don't hard code url's!
  type: 'POST',
  data: JSON.stringify(data),
  dataType: 'json',
  // traditional: true, // delete this
  contentType: "application/json; charset=utf-8", // add this
  success: function (data) {
      $('#pnDataCollection').html(data);
  });

旁注:尚不清楚您的收藏的价值来自哪里。假设您有表单控件来生成集合中的项目,那么您需要做的就是使用$('form').serialize(); 正确序列化您的数据并假设您已正确生成视图并回发到模型

【讨论】:

  • 是的,就是这样。现在可以了。 url 并不是真正的硬编码,它的一部分来自一个隐藏的控件,该控件在每次 ajax 更新时都会填充。数据并非来自输入控件。在前一个屏幕中,用户可以放置该数据,并且在此代码所在的屏幕中,用户选择复选框以创建数据的组合。感谢您和 BG101 的帮助!!
  • 你在硬编码 - 不要这样做 - 总是使用@url.Action()
【解决方案2】:

尝试将您的操作更改为:

 [HttpPost]
 public ActionResult AddRule(List<Source> sources, List<Destination> destinations, List<Protocol> protocols)  
 {

   return HttpNotFound();
 }

并将您的数据更改为:-

$.ajax({
  url: ThisController + '/AddRule',
  type: 'POST',
  data: postdata,
  dataType: 'json',
  traditional: true,
  success: function (data) {
    $('#pnDataCollection').html(data);
  }
});

$.ajax 将为您处理转换对象。只需确保操作参数名称与 javascript 对象属性名称匹配即可。

那就换

var sources = {};
var destinations = {};
var protocols = {};

var sources = [];
var destinations = [];
var protocols = [];

将对象添加到数组时,这样做

sources.push({ 'Name': field1, 'IP': field2, 'Username': field3 });

【讨论】:

  • 谢谢,但是方法中的参数仍然是空的。该方法如下所示: public ActionResult AddRule(List sources, List destinations, List 协议,字符串备注)
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2011-05-06
  • 2013-04-20
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多