【问题标题】:Serializing an object containing an array序列化包含数组的对象
【发布时间】:2013-02-03 02:42:06
【问题描述】:

-这个问题已经自己解决了-

所以我正在尝试使用 knockoutJS 并正在测试映射插件,但在序列化包含数组的对象时遇到了一些问题

下面是我拥有的控制器和下面的 javascript,我遇到的问题是无论我尝试什么(你可以看到注释掉的尝试修复)我无法让子数组传递给 javascript显示孩子 -{"id":5,"name":"Testing this works","children":"[{},{}]"} 是所有通过的。

谁能给我指出正确的方向

namespace TestingKnockout.Controllers
{ 
public class child
{
    int id;
    String name;

    public child(int id, string name)
    {
        this.id = id;
        this.name = name;
    }
}
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }   

    public virtual string GetData()
    {
        List<child> childrenList = new List<child>(){
                new child(2, "bob"),
                new child(4, "dave")
        };
        var result = new
        {
            id=5,
            name="Testing this works",
            children = childrenList
            //children = Newtonsoft.Json.JsonConvert.SerializeObject(childrenList)
            //children = new{ id = 2, name = "bob" }

        };

        //String resultsToHighlightJSON =                    Newtonsoft.Json.JsonConvert.SerializeObject(childrenList);
        //return resultsToHighlightJSON;
        return new JavaScriptSerializer().Serialize(result);// +resultsToHighlightJSON;
    }
}
}

这是我的javascript:

<script language="javascript" type="text/javascript">
  var originalData = {
      id: 1,
      name: "Main",
      children: []
  };

  var updatedData = {
      id: 1,
      name: "Main",
      children: [{ id: 2, name: "bob" }, { id: 3, name: "ted"}]
  };

  function Child(id, name) {
      this.id = ko.observable(id);
      this.name = ko.observable(name);
  }

  var options = {
      children: {
          key: function (data) {
              return ko.utils.unwrapObservable(data.id);
          }
      }
  }

  var viewModel = ko.mapping.fromJS(originalData, options);

  viewModel.counter = 1;
  viewModel.addChild = function () {
      viewModel.children.push(new Child(++viewModel.counter, "new"));
  };



  viewModel.applyUpdate = function () {
  var basePath="<%: Url.Content("~/") %>";
  var url = basePath + 'Home/GetData/';
   $.get(url, function (response) {
              var Employee = $.parseJSON(response);
              $("#EditLink").html("testing this out : " + Employee.children[1].name);
      //ko.mapping.fromJS( updatedData,viewModel);
      ko.mapping.fromJS( Employee,viewModel);
              });
  }

  $(document).ready(function() {
      ko.applyBindings(viewModel);
  });

【问题讨论】:

  • 您是否使用 Fiddler 查看实际返回给客户端的 JSON 是什么?
  • 当我使用应用程序时,传递的所有内容都是 {"id":5,"name":"Testing this works","children":"[{},{}]"}更新函数
  • 啊,这不是因为你不能像这样在 C# 中序列化一个通用列表吗?尝试将其更改为数组,看看是否可行。
  • @PaulManzotti 不,我更改为数组,但下面仍然传递空数组是我对无效数组的更改 child child1 = new child(2, "bob"); child child2 = new child(4, "dave"); child[] childrenList = new child[] { child1,child2};

标签: c# javascript asp.net-mvc-3 knockout.js knockout-mapping-plugin


【解决方案1】:

在你的 GetData() 函数中试试这个。

    return Newtonsoft.Json.JsonConvert.SerializeObject(result);

我从来没有遇到过 JSON.NET 的任何问题,而且我知道它支持匿名类型。

【讨论】:

  • 我之前已经以各种形式尝试过(您可能会从我注释掉的行中注意到。由于某些未知原因,该数组仍然作为空传递
【解决方案2】:
public class child
{
    public int id { get; set; }
    public String name { get; set; }

    public child(int id, string name)
    {
        this.id = id;
        this.name = name;
    }
}

我的错误是我没有设置公共属性

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多