Ich baue eine ASP.NET MVC 5 App mit Visual Studio 2015. Die Suche funktioniert gut beim ersten Versuch, aber dann, wenn ich eine der Seitenzahlen in der klicken MVC PagedList component, es wirft eine Internal Server Error
. Hier ist das AJAX-Formular; beachten Sie, dass sie die Daten von der Suche nach einer Teilansicht empfangen passiert:ASP.NET MVC PagedList mit AJAX in Teilansicht
@using (Ajax.BeginForm("SearchCustomers", "Permits",
new AjaxOptions
{
UpdateTargetId = "targetElement",
OnSuccess = "onAjaxSuccess",
OnFailure = "onAjaxFailure"
},
new { @class = "form-horizontal form-small", role = "form", id="customerSearchForm" }))
{
@Html.AntiForgeryToken()
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4>Customer Search</h4>
</div>
<div class="modal-body">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group-sm clearfix">
@Html.LabelFor(m => m.SearchVm.SearchCustomerNameNumber, new { @class = "control-label col-xs-5 col-md-5" })
<div class="col-xs-5 col-md-5">
<div class="input-group">
@Html.EditorFor(m => m.SearchVm.SearchCustomerNameNumber, new {htmlAttributes = new {@class = "form-control"}})
<span class="input-group-btn">
<button type="submit" class="btn btn-custom-success btn-sm btn-custom-sm small-box-shadow btn-block">
Search
<i class="fa fa-search fa-lg" aria-hidden="true"></i>
</button>
</span>
</div>
@Html.ValidationMessageFor(m => m.SearchVm.SearchCustomerNameNumber, "", new { @class = "text-danger" })
</div>
</div>
<div class="modal-search" id="targetElement">
@Html.Partial("_PermitsCustomerList", Model.SearchVm.Customers)
</div>
</div>
}
In _PermitsCustomerList
Teilansicht, ich habe folgende:
@using PagedList
@using PagedList.Mvc
@model IPagedList<MyProject.ViewModels.CustomerViewModel>
@if (Model != null && Model.Count > 0)
{
<div class="panel panel-default data-grid data-grid-wide">
<table class="table table-hover table-striped table-bordered table-responsive">
<tr>
<th>
Customer #
</th>
<th>
Customer Name
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Customer_NO)
</td>
<td>
@Html.DisplayFor(modelItem => item.Customer_Name)
</td>
</tr>
}
</table>
<div id="contentPager">
@Html.PagedListPager(Model, page => Url.Action("SearchCustomers", "Permits",
new { page }),
PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(new AjaxOptions()
{
HttpMethod = "POST",
UpdateTargetId = "targetElement",
OnSuccess = "onAjaxSuccess",
OnFailure = "onAjaxFailure"
}))
</div>
</div>
}
Und hier ist die Aktion auf dem Controller:
[HttpPost]
[ValidateAntiForgeryToken]
public PartialViewResult SearchCustomers(PermitsViewModel permitsVm, int? page)
{
if (string.IsNullOrEmpty(permitsVm.SearchVm.SearchCustomerNameNumber)) return null;
permitsVm.Page = page;
int number;
var list = int.TryParse(permitsVm.SearchVm.SearchCustomerNameNumber, out number)
? CustomerDataService.SearchCustomerByNumber(number)
: CustomerDataService.SearchCustomerByName(permitsVm.SearchVm.SearchCustomerNameNumber);
return PartialView("_PermitsCreateCustomerList", list.ToPagedList(permitsVm.Page ?? 1, 10));
}
Hier sind die Erfolge und Misserfolge Callback-Funktionen:
function onAjaxFailure(xhr, status, error) {
$("#targetElement").html("<strong>An error occurred retrieving data:" + error + "<br/>.</strong>");
}
function onAjaxSuccess(data, status, xhr) {
if (!$.trim(data)) {
$("#targetElement").html("<div class='text-center'><strong>No results found for search.</strong></div>");
}
}
Ich schaute auf dieses Beispiel: MVC 4 Using Paged List in a partial View und fügte die PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing
hinzu, aber etwas fehlt noch.
Wenn ich die Konsolentafel in Chrome zu sehen, hat es diesen Fehler, wenn ich auf einer Seitennummer klicken:
http://localhost:9999/MyProject/Permits/SearchCustomers?page=2 500 (Internal Server Error)
Was mache ich falsch, wenn versuchen, einen AJAX-Anruf mit der Komponente PagedList
zu tun?