ASP.NET MVC3: WebGrid + Ajax Filters + Ajax Sorting & Paging
В основном я использую WebGrid и мне нужно отфильтровать результаты. Первая проблема, с которой я столкнулся, это то, что я впервые использую WebGrid, и я надеялся, что некоторые из вас могли бы помочь мне с этим... Пока мне удалось отсортировать результаты сетки и отфильтровать их с помощью Ajax, но когда при повторной сортировке отфильтрованных результатов подмножество теряется, и я возвращаюсь к началу с полным набором результатов. Я знаю, почему это происходит, конечно, но я не понимаю, как заставить это работать.
Пример:
На мой взгляд:
@model IQueryable<Cities>
@section MoreScripts
{
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
}
@using (Ajax.BeginForm(new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "GridData"}))
{
<fieldset>
<legend>Search Filters</legend>
<br />
<div>
Name
</div>
<div>
@Html.TextBox("Name")
</div>
<p>
<input type="submit" value="Search" />
</p>
</fieldset>
}
<div id="GridData">
@Html.Partial("Grid", Model)
</div>
Мой частичный вид:
@model IQueryable<Cities>
@{
var grid = new WebGrid<Cities>(null,rowsPerPage: 5, defaultSort: "Nombre", ajaxUpdateContainerId: "GridData");
grid.Bind(Model, autoSortAndPage: true, rowCount: Model.Count());
@grid.GetHtml(columns:
grid.Columns(
grid.Column("Name", "Name", canSort: true),
grid.Column("CreationDate", "Creation Date", canSort: true),
grid.Column("Active", "Active", canSort: true, format: @<text><input type="checkbox" disabled="disabled" value="@item.ID" @(item.Active == true ? "Checked" : null) /></text>),
grid.Column(format: (item) => Html.ActionLink("Edit", "Edit", new { id = item.Id }, new { @class = "editLink smallCell", @title = "Edit" })),
grid.Column(format: (item) => Html.ActionLink("Delete", "Delete", new { id = item.Id }, new { @class = "deleteLink smallCell", @title = "Delete" }))),
tableStyle: "webgrid",
headerStyle: "webgrid-header",
footerStyle: "webgrid-footer",
alternatingRowStyle: "webgrid-alternating-row",
selectedRowStyle: "webgrid-selected-row",
rowStyle: "webgrid-row-style");
}
И, наконец, что я делаю не так, здесь, на моем контроллере:
public ActionResult Index()
{
return View(repository.GetAllRecords().OrderByDescending(f => f.CreationDate));
}
[HttpPost]
public ActionResult Index(string name)
{
var data = repository.GetAllRecords();
if(!string.IsNullOrEmpty(name))
data = data.Where(a => a.Name.Contains(name));
data = data.OrderByDescending(f => f.CreationDate);
return PartialView("Grid", data);
}
Я также использую класс WebGrid: WebGrid, как показано здесь: http://archive.msdn.microsoft.com/mag201107WebGrid/Release/ProjectReleases.aspx?ReleaseId=5667
Таким образом, это на самом деле хорошо работает для фильтрации, но как только вы получите отфильтрованные результаты, а затем попытаетесь изменить порядок сортировки ваших суженных результатов поиска, вы потеряете элементы и значение параметра 'name', потому что WebGrid повторяет первое действие контроллера, Возможно, это не лучший подход, но, как я уже сказал, я никогда не использовал WebGrid, поэтому я готов учиться. Любая помощь могла бы быть полезна. Благодарю.
1 ответ
Попробуйте добавить FormMethod.Post к вашей форме, чтобы запрос перешел ко второму ActionResult. В противном случае запрос является GET и переходит к первому индексу ActionResult () без параметров.