Buduję aplikację ASP.NET MVC 5 przy użyciu programu Visual Studio 2015. Wyszukiwanie działa poprawnie za pierwszym razem, ale jeśli kliknę dowolny numer strony w MVC PagedList component, rzuca Internal Server Error
. Oto formularz AJAX; pamiętać, że przekazuje dane otrzymane z wyszukiwania z częściowym widokiem:PagedList ASP.NET MVC za pomocą AJAX w częściowym widoku
@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>
}
W _PermitsCustomerList
częściowego widzenia, mam następujące:
@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>
}
i tu jest działaniem na kontrolerze:
[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));
}
Oto sukces i porażka oddzwonienia funkcje:
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>");
}
}
Spojrzałem na ten przykład: MVC 4 Using Paged List in a partial View i dodano PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing
, ale czegoś jeszcze brakuje.
Kiedy wyświetlić panel konsoli w Chrome, ma ten błąd po kliknięciu na numer:
http://localhost:9999/MyProject/Permits/SearchCustomers?page=2 500 (wewnętrzny błąd serwera)
Co robię źle kiedy próbuje wykonać wywołanie AJAX z komponentem PagedList
?