我想替换我的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' },
]
});
}
});
});
我的代码不起作用,我遗漏了很多东西 我的问题:
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; }
}
答案 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' },
]
});
}