Я реализовал WebGrid. Сортировка, пейджинг и фильтрация не работают вместе. Они работают, когда вы используете их в одиночку. Когда вы объединяете три, в то же время фильтрация не работает.
Симптом:
Отфильтруйте набор результатов, затем выполните сортировку.
или
Отфильтруйте набор результатов, затем перейдите на следующую страницу.
В обоих случаях фильтр теряется. Но это страница и сортировка.
В коде позади: Когда метод действия вызывается через сортировку или разбивку на страницы, для каждого из параметров фильтра отображаются значения NULL.
Когда метод действия вызывается через фильтр, параметры фильтра проходят.
Это говорит мне, что когда вы инициируете сортировку или разбивку на страницы, чтобы она не отправляла форму.
public ActionResult MyPage(int? page, int? rowsPerPage,
string sort, string sortdir,
string orderNumber, string person, string product)
Я посмотрел на SO и в другом месте. Есть много примеров, и люди спрашивают, как делать то или другое или все три. Но я видел только один с моей проблемой, поэтому я размещаю его здесь. (его также не было решено)
У меня есть моя страница реализована следующим образом:
@using (Ajax.BeginForm("MyPage", null, new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" }, new { id = "filter" }))
{
<div class="right">
<select id="rowsPerPage" name="rowsPerPage">
<option>15</option>
<option>25</option>
<option>50</option>
<option>75</option>
<option>100</option>
</select>
</div>
<div class="table">
<div class="tableRow">
<div class="tableCell">
Order Number
</div>
<div class="tableCell">
Person
</div>
<div class="tableCell">
Product
</div>
</div>
<div class="tableRow">
<div class="tableCell">
<input type="text" id="orderNumber" name="orderNumber" />
</div>
<div class="tableCell">
<input type="text" id="person" name="person" />
</div>
<div class="tableCell">
<input type="text" id="product" name="product" />
</div>
<div class="tableCell">
<input type="submit" class="button" value="Search" />
</div>
</div>
</div>
<br/>
<div id="myGrid">
@Html.Partial("_MyPage", Model)
</div>
}
Сетка реализуется как частичное представление, подобное этому:
<script type="text/javascript">
$(document).ready(function () {
resetUI();
});
</script>
@{
var grid = new WebGrid(canPage: true, rowsPerPage: Model.rowsPerPage, canSort: true, ajaxUpdateContainerId: "grid", ajaxUpdateCallback: "resetUI");
grid.Bind(Model.rows, rowCount: Model.TotalRecords, autoSortAndPage: false);
@grid.GetHtml(
tableStyle: "fancyTable",
headerStyle: "header",
footerStyle: "footer",
rowStyle: "row",
alternatingRowStyle: "alt",
mode: WebGridPagerModes.Numeric | WebGridPagerModes.NextPrevious,
nextText: "Next",
previousText: "Previous",
htmlAttributes: new { id = "grid" },
columns: grid.Columns(
grid.Column("OrderDate", "Order Date", format: @<text>@((item.OrderDate != null) && (item.OrderDate.ToString("MM/dd/yyyy") != "01/01/0001") ? item.OrderDate.ToString("MM/dd/yyyy") : "")</text>),
grid.Column("OrderNumber", "Order Number"),
grid.Column("Field1, "Field 1"),
grid.Column("Field2", "Field 2"),
grid.Column("Person", "Person"),
grid.Column("Product", "Product"),
grid.Column(format: (item) => Html.ActionLink("View", "Details", new { id = item.orderNumber }))
)
);
}