2017-02-12 8 views
0

Я хочу заменить свой MVC.GRID для использования JQuery Datatable, но это не так просто, как кажется. Я искал в Интернете несколько примеров, но не очень много с MVC. Единственное, что я нашел, это было сосредоточено на работе на стороне сервера, которая мне не нужна, так как мои данные не настолько огромны.MVC DataTable сложный объект

Издание:

на основе 2-х параметров, я хочу, чтобы получить список пользователей и отображать их на DataTable

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' содержит свойство, которое является типом 'User' (которое создает циклическую ссылку) –

+0

Я обновил свой вопрос, но помимо сообщения об ошибке, это способ, которым я конвертирую в JSON верный? а также способ, которым я называю datatable в представлении? также как я могу передать параметр? – Maro

+0

В ваших моделях ничего не может быть, что может вызвать эту ошибку.Но так как вы только хотите отобразить 4 свойства, нет смысла отправлять все по проводам, поэтому гораздо лучше создать анонимный объект, содержащий только 4 свойства, которые вам нужны –

ответ

1

MVC по умолчанию использует JavascriptSerializer для Conver ting для 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

Спасибо, но как я могу передать параметр, public ActionResult Prov (int id, int cityId) имеет 2 параметра, а мой вызов равен $ .ajax ({ url:/FuelAssemblyComposition/Prov ', – Maro

+1

Вы имеете в виду передать значения 'id' и' cityId' из представления в метод? Если это так, просто добавьте 'data: {id: x, cityId: y},' в параметры ajax (где 'x' и' y' являются 'int' - но я не знаю, откуда берутся эти значения) –

+0

они поступают из viewBag, – Maro

 Смежные вопросы

  • Нет связанных вопросов^_^