2016-10-27 1 views
0

Ich habe eine Sicht mit 1700 Aufzeichnungen. Ich möchte sie mit Ajax paginieren, um die Seitenladung leichter zu machen. Ich bin in der Lage, Paging zu machen und jedes Mal neue Datensätze zu erstellen, basierend auf der ausgewählten Seite.Wie übertrage ich Daten vom Controller zur Ansicht mit IEnumerable Model in MVC?

Das Problem ich nur 10 Indizes in Seite unten am zeigt, die Seite sowie 4 nach links und 5 nach rechts ausgewählt. Jetzt brauche ich den CurrentPage-Wert, den ich jedes Mal von jQuery/ajax an den Controller sende, den ich als Ajax-Datenparameter bekomme. Das Problem besteht darin, den aktuellen Seitenwert dauerhaft anzuzeigen, wenn der nächste Seitenindex ausgewählt wird. Ich bekomme immer den alten Wert und nicht den zuletzt ausgewählten Seitenwert. Ich habe sogar ViewBag anstelle von TempData verwendet, aber keinen Erfolg.

Code anzeigen:

@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-Code:

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); 
     } 

Bitte helfen.

+0

Bitte http://stackoverflow.com/help/mcve lesen - „Wie ein Minimal, komplett erstellen , und überprüfbares Beispiel ". Dies ist nur ein Code-Dump und Sie erwarten, dass wir uns darauf einlassen. –

+0

@PeterB Alles ist relevant für das Problem, deshalb gebucht. Ich mache Client-Seiten-Paging, also brauche ich einen Weg, wo ich Werte in etwas anderem als Model wie ViewBag speichern kann, das persistent bleibt. –

Antwort

0

Packen Sie Ihr Modell IEnumerable<UrCompedDAL.DBModels.SlotMachineModel> in ein anderes Modell und stellen Sie Ihr Modell als eine Eigenschaft des neuen Modells ein. Übergeben Sie dieses neue Modell als Modell für Ihre Ansicht. Sie können so viele Daten vom Controller übertragen, wie Sie möchten.

+0

Ich habe das versucht, aber der Wert der aktuellen Seite, den ich in Model speichert, ist nicht persistent. Ich habe sogar versucht, es in einem versteckten Feld zu speichern, aber selbst das funktioniert nicht. Es gibt immer den ältesten Wert an. Entweder liegt es an Ajax oder weiß nicht welchen Grund. @ Krzysiek-Szymczak –

0

Das Problem ist, dass Sie die ganze Sicht neu zu erstellen, aber die Aktualisierung nur die table aus dem Ergebnis

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

(Sie sollten auch überlegen, wie Sie die Tabelle aus der Sicht extrahieren und eine teilweise verwenden stattdessen).

Keines der Ajax/2nd + Rendering des Paging ul wird verwendet und wird jedes Mal "weggeworfen".

Sie können Ihre UL entweder auf die gleiche Weise wie die Tabelle überschreiben oder das Seitenelement über Javascript (wahrscheinlich das vorherige) aktualisieren.

die ganze Sicht Weiternutzung (statt einer partialview), würden Sie so etwas wie erhalten:

}).done(function (data) {  
    var html = $("<div/>").html(data); 
    $('#tbl_slots').html(html.find("#tbl_slots").html()); 
    $('ul.paging').html(html.find("ul.paging").html()); 
Verwandte Themen