4

我正在尝试通过 JQuery 将复杂的 ViewModel 对象获取到我的视图中$.getJSON。但是,尽管它适用于简单对象,但当我的视图模型包含其他对象列表作为其中的一部分时,我的 Ajax 请求将停止工作。

这就是我获取数据的方式,

$.getJSON('/Company/GetCompanies', function(data) { 
    viewModel.model = ko.mapping.fromJS(data)
    ko.applyBindings(viewModel)
});

这是工作视图模型,

public class CompanyIndex
{
    public IList<CompanyWithDetail> Companies { get; set; }

    public void FillCompanies()
    {
        UnitOfWork unitOfWork = new UnitOfWork();
        unitOfWork.CompanyRepository.SetProxy(false);
        var CompanyFromDB = unitOfWork.CompanyRepository.GetCompanyWithDetails();

        Companies = new List<CompanyWithDetail>();
        foreach (Company company in CompanyFromDB)
        {
            CompanyWithDetail newCompany = new CompanyWithDetail();
            newCompany.CompanyName = company.CompanyName;
            Companies.Add(newCompany);

        }
        unitOfWork.Dispose();
    }
}

这是 CompanWithDetail 类,

// For sake of demonstration it only contains name
public class CompanyWithDetail
{
    public string CompanyName { get; set; }
}

这工作正常。但是,当我添加

public IList<CompanyFaxNumber> FaxNumber { get; set; }

将此属性添加到 CompanyWithDetail 类,并将其填充到 viewmodel 的FillCompanies()方法中CompanyIndex,我的 ajax get 请求停止工作。

这是我的控制器顺便说一句,在这两种情况下它都会返回正确的数据,但是当我添加复杂对象时,jquery$.getJSON没有收到。

public ActionResult GetCompanies()
{
    var model = new CompanyIndex();
    model.FillCompanies();
    return Json(model ,JsonRequestBehavior.AllowGet);   
}

编辑1:

说 getJSON 没有收到数据,我的意思是函数体没有被执行。

$.getJSON('/Company/GetCompanies', function(data) { 
    alert('test')
});

例如,警报在没有复杂对象时工作,但当我将对象添加到视图模型时它停止工作。


编辑 2

这是我从浏览器而不是 ajax 调用“Company/GetCompanies”时的错误。

序列化“CompanyManagement.Models.CompanyEmail”类型的对象时检测到循环引用。


我需要做一些特殊的事情来将复杂的对象从控制器传递到视图吗?有任何想法吗?

4

3 回答 3

4

我需要做一些特殊的事情来将复杂的对象从控制器传递到视图吗?

是的,您应该使用视图模型。您不能 JSON 序列化在它们之间包含循环引用的对象层次结构。如果您希望能够对模型进行 JSON 序列化并通过网络发送,您将不得不打破这些循环引用。JSON 序列化格式根本不支持这一点。

于 2012-07-05T08:55:55.313 回答
1

默认 JSON 序列化程序无法处理循环引用。您可能拥有 Company 和 Emails 属性,并且每个 Email 都再次引用了 Company。

正如达林建议的那样,您要么需要发送视图模型(无论如何这是最佳实践):

http://blog.davebouwman.com/2011/12/08/handling-circular-references-asp-net-mvc-json-serialization/

...或者您可以将默认的 JSON 序列化程序替换为可以处理循环引用的Json.NET :

序列化 LINQ to SQL 类时出现循环引用异常

于 2012-07-05T09:00:10.473 回答
0

您可以使用 dataType= json 简单地进行 ajax post 调用

    $.ajax({
                type: 'POST',
                url: '@Url.Action("actionName", "controllerName")',
            data: JSON.stringify({ *Perameter If Any* }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (result) {                  
                  if (result != null) {

                } else {


                }
            }
           });

你的动作方法应该是一个 Json 结果

public JsonResult ActionName(perameter)
    {

            var modle= getobject();
            return Json(modle);
  }

在上述情况下,您将在ajax调用的成功方法中收到结果将与您发送的完全相同的对象...无需序列化或任何技巧..看起来很简单

于 2015-06-16T05:11:04.433 回答