2017-02-12 118 views
0

我想替換我的MVC.GRID使用JQuery Datatable但它並不像看起來那麼容易。我在網上搜索了一些例子,但沒有太多與MVC。 唯一一個我發現它專注於服務器端操作,我不需要,因爲我的數據並不那麼龐大。MVC DataTable複雜對象

問題:

基於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> 

這裏是我如何訪問nasted對象在Ajax調用

$(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. 我缺少什麼,使其工作

PS:?我得到了以下錯誤:當我調用返回JSON

A circular reference was detected while serializing an object of type '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

顯示你的'UID'和'Prof'模型。該消息表明'UID'和/或'Prof'包含一個屬性type是'User'(創建一個循環引用) –

+0

我更新了我的問題,但在錯誤消息旁邊,我轉換爲JSON的方式是正確?還有我在視圖中調用數據表的方式?我怎樣才能傳遞參數? – Maro

+0

您的模型中似乎沒有任何可能導致該錯誤的內容。但是因爲你只想顯示4個屬性,所以沒有必要通過線路發送所有東西,所以創建一個只包含你需要的4個屬性的匿名對象要好得多 –

回答

1

MVC默認使用JavascriptSerializer爲CONVER不支持帶有循環引用的模型的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' }, 
     ] 
    }); 
} 
+0

傳遞參數謝謝,但我怎麼可以傳遞參數,公共ActionResult箴(詮釋id,詮釋cityId)有2個參數,我的電話是$ .ajax({url:'/FuelAssemblyComposition/Prov', – Maro

+1

你的意思是將'id'和'cityId'的值從視圖傳遞給方法嗎?如果是這樣,只需將'data:{id:x,cityId:y}'添加到ajax選項(其中'x'和'y'是'int' - 但我不知道這些值來自哪裏) –

+0

它們來自viewBag, – Maro