MVC DataTable复杂对象

时间:2017-02-12 19:51:07

标签: json asp.net-mvc datatables

我想替换我的MVC.GRID以使用 JQuery Datatable ,但它并不像看起来那么容易。我在网上搜索了一些例子,但与MVC并不多。 唯一一个我发现它专注于服务器端操作,我不需要,因为我的数据不是那么大。

问题:

基于2个参数,我想获得用户列表并在数据表

上显示它们
public class User
    {
        public Address Address { get; set; }
        public UID UID { get; set; }
        public String Name { get; set; }
        public Prof Prof { get; set; }
    }

这里我是如何从数据库中获取用户的:

 public ActionResult Prov(int id,int cityId)
        {
            var users =
                    Uow.Users.GetAllByIdAndCityId(id,cityId).ToList();
            return Json(new
            {
               data = users 
            }, JsonRequestBehavior.AllowGet);
        }

在我看来

 <table id="ProvTable">
                    <thead>
                        <tr>
                            <th>Name</th>
                            <th>City Name</th>
                            <th>UID Code</th>
                            <th>Title</th>
                        </tr>
                    </thead>
                </table>

这是我如何在ajax调用中访问nasted对象

$(document).ready(function() {
            $.ajax({
                url: '/Users/Prov',
                method: 'post',
                datatype: 'json',
                success: function(data) {
                    $('#ProvTable').DataTable({
                        data: data,
                        columns: [
                            { 'data': 'Name' },
                            { 'data': 'Address.City.Name' },
                            { 'data': 'UID.Code' },
                            { 'data': 'Prof.Title' },
                        ]
                    });
                }
            });

        });

我的代码不起作用,我遗漏了很多东西 我的问题:

  1. 我如何传递参数? (存储在ViewBag中
  2. 我如何进入nasted对象
  3. 我将列表转换为json的方式是正确的吗?
  4. 我缺少什么让它起作用?
  5. PS:我收到以下错误:当我调用return Json

      

    在序列化“System.Data.Entity.DynamicProxies.Address_303E2DDFF080BE1C1CCF72F05B5DEE54E141232835E91070AA59A7AC0D8E5DD3”类型的对象时检测到循环引用。

    public class Prof
        {
            public string Title{ get; set; }
            public KOS KOS{ get; set; }
        }
    
    public class KOS
        {
            public Category Cat{ get; set; }
            public string KosCode{ get; set; }
        }
    
    public class Category
        {
            public string Name{ get; set; }
            public string CatCode{ get; set; }
        }
    
    public class UID
        {
            public string Name{ get; set; }
            public string UIDCode{ get; set; }
        }
    
    public class Address
        {
            public City City{ get; set; }
            public String Zip{ get; set; }
        }
    

1 个答案:

答案 0 :(得分:1)

默认情况下,MVC使用JavascriptSerializer转换为JSON,后者不支持带循环引用的模型。当模型包含属性是复杂对象时,会发生错误,并且该对象包含对模型的引用,例如User包含Prof的属性,Prof包含属性User

您展示的模型并未提示,但我假设您没有显示所有模型的所有属性。

在任何情况下,当你想要的只有4个属性时,没有必要通过网络发送每个模型的每个属性,并且解决这个问题(并提高性能)的简单方法是创建一个只包含你的匿名对象需要

public ActionResult Prov(int id, int cityId)
{
    var users = Uow.Users.GetAllByIdAndCityId(id, cityId).Select(x => new
    {
        Name = x.Name,
        City = x.Address.City.Name,
        Code = x.UID.Code,
        Title = x.Prof.Title
    };
    return Json(users, JsonRequestBehavior.AllowGet);
}

并在脚本中

success: function(data) {
    $('#ProvTable').DataTable({
        data: data,
        columns: [
            { 'data': 'Name' },
            { 'data': 'City' },
            { 'data': 'Code' },
            { 'data': 'Title' },
        ]
    });
}