2016-10-27 2 views
0

У меня есть вид с 1700 записями. Я хочу разбивать их на страницы с помощью ajax, чтобы сделать загрузку страницы легче. Я могу делать пейджинг и приносить множество новых записей каждый раз на основе выбранной страницы.Как передать данные с контроллера на просмотр с помощью IEnumerable Model в MVC?

Проблема Я показываю только 10 индексов в страницы дна, страница выбрана, а также 4 слева и 5 справа. Теперь мне нужно значение CurrentPage, которое я отправляю каждый раз из jQuery/ajax в контроллер, который я получаю как параметр данных ajax. Проблема заключается в возврате значения текущей страницы, которое постоянно просматривается при выборе индекса следующей страницы. Я всегда получаю старое значение, а не последнее выбранное значение страницы. Я даже использовал ViewBag вместо tempData, но не имел успеха.

View Code:

@model IEnumerable<UrCompedDAL.DBModels.SlotMachineModel> 
<div class="my-properties"> 
          <table id="tbl_slots" class="table no-margin" data-search="true" data-pagination="false"> 
           <tbody class="orgTbody"> 
            @foreach (var item in Model) 
{ 
             <tr> 
              //Code for Slot list 
             </tr> 
                   } 
           </tbody> 
          </table> 
          <ul class="paging"> 
           @{ 
               int i = 1; 
               int pg = Convert.ToInt32(TempData["Current"]); 
               if (i > 0 || i == ViewBag.PageSize) 
               { 
             <li> 
              <a href="#" class="lipaging"><<</a> 
             </li> 
            } 


            if (pg < 6) 
            { 
             for (i = 1; i < 11; i++) 
             { 
              <li> 
               <a href="#" class="lipaging">@i</a> 
              </li> 
             } 
            } 

            else 
            { 
             for (i = pg - 4; i < pg; i++) 
             { 
              <li> 
               <a href="#" class="lipaging">@i</a> 
              </li> 
             } 
             for (i = pg; i < pg + 6; i++) 
             { 
              <li> 
               <a href="#" class="lipaging">@i</a> 
              </li> 
             } 
            } 


            if (i > 1 || i < ViewBag.PageSize) 
            { 
             <li> 
              <a href="#" class="lipaging">>></a> 
             </li> 
            } 
           } 
          </ul> 
         </div> 
<script> 
    $(document).ready(function() { 
$('.lipaging').click(function() { 
      $("#loadingDiv").show(); 
      $(this).addClass('active'); 
      var pageThis = $(this).text(); 
      var current = @TempData["Current"]; 
      if (pageThis == '>>') { 
       pageThis = current +1; 
      } 
      if (pageThis == '<<') { 
       pageThis = current -1; 
      } 
$.ajax({ 
       type: 'get', 
       url: '@Url.Action("Index", "Game_SlotMachine")', 
       data: { 
        CurrentPage: pageThis 
       } 
      }).done(function (data) { 

       var startIndex = data.indexOf("<tbody"); 
       var endIndex = data.indexOf("</tbody>"); 
       var html = data.substring(startIndex, endIndex + 8); 


       $('#tbl_slots').html(''); 
       $('#tbl_slots').html(html); 

       setTimeout(function() { 
        filter(); 
       }, 300); 
       $("#loadingDiv").hide(); 
}); 
     }); 

Controller Код:

public ActionResult Index(int id = 0, int CurrentPage = 1) 
     { 
      List<SlotMachineModel> slotmodel = new List<SlotMachineModel>(); 
      slotmodel = UrCompedDAL.DataAccessor.Instance.GameAccessor.GetAllSlotMachines().ToList(); 
      ViewBag.PageSize = slotmodel.Count/10; 

      TempData["Current"] = CurrentPage; 

       slotmodel = slotmodel.Skip((CurrentPage - 1) * 10).Take(10).ToList(); 
      return View(slotmodel); 
     } 

Пожалуйста, помогите.

+0

Пожалуйста, прочтите http://stackoverflow.com/help/mcve - «Как создать Minimal, полный , и Подтверждаемый пример ". Это всего лишь свалка кода, и вы ожидаете, что мы в нее заработаем. –

+0

@PeterB Все имеет отношение к проблеме, поэтому опубликовано. Я делаю клиентскую подкачку, поэтому мне нужен способ хранения значений в чем-либо, кроме Model, например ViewBag, который остается постоянным. –

ответ

0

Упакуйте свою модель IEnumerable<UrCompedDAL.DBModels.SlotMachineModel> в другую модель и установите свою модель как свойство новой модели. Передайте эту новую модель в качестве модели для вашего вида. Вы сможете передавать столько данных от контроллера, сколько хотите.

+0

Я пробовал это, но все же значение текущей страницы, которое я храню в модели, не является постоянным. Я даже пытался хранить его в скрытом поле, но даже это не работает. Он всегда дает самое старое значение. Либо это из-за ajax, либо не знает, в чем причина. @ Krzysiek-Szymczak –

0

Вопрос заключается в том, что вы воссоздавать целое представление, но только обновление table из результата

var html = data.substring(startIndex, endIndex + 8); 
$('#tbl_slots').html(''); 
$('#tbl_slots').html(html); 

(вы должны также пересмотреть, как извлечь таблицу с точки зрения и использовать частичный вместо).

Ни один из ajax/2nd + render подкачки ul не используется и «выбрасывается» каждый раз.

Вы можете либо перезаписать свою улицу так же, как и таблицу, либо обновить элемент подкачки через javascript (возможно, первый).

Повторное использование весь вид (а не PartialView), вы получите что-то вроде:

}).done(function (data) {  
    var html = $("<div/>").html(data); 
    $('#tbl_slots').html(html.find("#tbl_slots").html()); 
    $('ul.paging').html(html.find("ul.paging").html()); 
Смежные вопросы