Ich habe eine Liste in asp.net Mvc 5ASP.Net MVC 5 Legen Sie Listendaten über Ajax
ich nur über begrenzte die Anzahl der Datensätze in Seite angezeigt werden.
jetzt auf Scroll Ich mache Ajax Anruf, der erste Anruf funktioniert gut, aber wenn ich mehr scrollen, rufen Sie die Funktion wiederholt 5 bis 10 Mal und verlor es wieder anzeigen die Daten, es war wirklich seltsam, ich konnte keine Lösung finden
Mein Controller:
public ActionResult Index()
{
int starting = 0;
if (Request.Form["starting"] != null)
{
starting = Convert.ToInt32(Request.Form["starting"]);
}
int takes = 15;
if (Request.Form["takes"] != null)
{
takes = Convert.ToInt32(Request.Form["takes"]);
}
//string strpost = "&ajax=1";
var query = db.MyEmployee.ToList().Skip(starting).Take(takes);
if (Request.IsAjaxRequest())
{
starting = starting+15;
query = db.MyEmployee.ToList().Skip(starting).Take(takes);
ViewData["starting"] = starting;
ViewBag.takes = takes;
return PartialView("_PartialIndex",query);
}
ViewBag.starting = starting;
ViewBag.takes = takes;
return View(query);
}
My Model:
public class Employee
{
public int Id { get; set; }
public string FullName { get; set; }
public string Email { get; set; }
}
Meine Ansicht und Teilansicht Code:
<div id="mypage">
@model IEnumerable<MVC5WAuth.Models.Employee>
@{
ViewBag.Title = "Index";
}
<h2>Index 1</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Id)
</th>
<th>
@Html.DisplayNameFor(model => model.FullName)
</th>
<th>
@Html.DisplayNameFor(model => model.Email)
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.FullName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
@Html.ActionLink("Details", "Details", new { id = item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id = item.Id })
</td>
</tr>
}
</table>
<script type="text/javascript">
$(window).scroll(function() {
if ($(window).scrollTop() == $(document).height() - $(window).height()) {
// ajax call get data from server and append to the div
var ajax_image = "<img src='../Content/loading.GIF' >";
$('#mypage').html(ajax_image);
var params = '&starting=' + @ViewBag.starting + '&takes=' + @ViewBag.takes;
$.ajax({
url:'@Url.Action("Index", "Employees")',
type: "POST",
data: params,
})
.done(function (r) {
$('#mypage').html(r);
});
}
});
</script>
Wo Sie die Verwendung von 'ViewBag' in Ihrem Javascript-Funktion machen wird nie aktualisieren, da es nicht ist sein als Teil des AJAX-Aufrufs neu geladen. Ich würde vorschlagen, eine Variable in JS beizubehalten, die Sie bei jedem AJAX-Aufruf erhöhen können. –
Ihr Skript verwendet '@ ViewBag.starting' und' @ ViewBag.takes', die die Anfangswerte beim ersten Generieren der Ansicht sind (sie werden nicht aktualisiert, nur weil Sie sie in der Methode erneut festlegen). Sie müssen die Werte als Javascript-Variable beibehalten und sie inkrementieren. –
Wie ich sehe, ändern Sie nicht Ihre 'startende' Variable in js. Deshalb erhalten Sie immer wieder dieselben Daten. Und etwa 5-10 Anruf kann etwas falsch mit Ihren Berechnungen in der ersten Zeile sein. –