这听起来像一个简单的问题,但我整个下午都在努力解决这个问题。我正在尝试在 PartialView 中放置一个带有分页、排序和所有内容的网格。我的第一个问题是寻呼机链接:它们没有我的过滤器选项,因为它不在页面查询字符串上。我就是这样解决的:
public class PaginationContainer
{
public IPagination PaginatedResult { get; set; }
public RouteValueDictionary RouteValueDictionary { get; set; }
}
我创建了这个类,然后由我的寻呼机使用:
@using MvcContrib.UI.Pager
@model AqxWeb.Models.PaginationContainer
@{
string action = ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString();
string controller = ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString();
}
@functions
{
public RouteValueDictionary GetRoute(int page)
{
var routeValues = new RouteValueDictionary();
foreach (string key in Model.RouteValueDictionary.Keys)
{
routeValues[key] = Model.RouteValueDictionary[key];
}
routeValues["page"] = page;
return routeValues;
}
}
<p />
<div class='pagination'>
<span class='paginationLeft'>Mostrando @Model.PaginatedResult.FirstItem - @Model.PaginatedResult.LastItem
de @Model.PaginatedResult.TotalItems</span> <span class='paginationRight'>
@{
if (Model.PaginatedResult.HasPreviousPage)
{<text> @Html.ActionLink("Primeira", action, controller, GetRoute(1), new Dictionary<string, object> { { "class", "paging" } })
| </text>}
else
{<text> Primeira | </text>}
if (Model.PaginatedResult.HasPreviousPage)
{<text>@Html.ActionLink("Anterior", action, controller, GetRoute(Model.PaginatedResult.PageNumber - 1), new Dictionary<string, object> { { "class", "paging" } })
| </text>}
else
{<text>Anterior | </text>}
if (Model.PaginatedResult.HasNextPage)
{<text>@Html.ActionLink("Próxima", action, controller, GetRoute(Model.PaginatedResult.PageNumber + 1), new Dictionary<string, object> { { "class", "paging" } })
| </text>}
else
{<text>Próxima | </text>}
if (Model.PaginatedResult.HasNextPage)
{<text>@Html.ActionLink("Última", action, controller, GetRoute(Model.PaginatedResult.TotalPages), new Dictionary<string, object> { { "class", "paging" } })</text>}
else
{<text>Última</text>}
}
</span>
</div>
我所要做的就是填写这本字典,我在 ActionMethod 上做的事情。
现在我需要一个类似的排序解决方案......我需要覆盖 MVCContrib 创建的表头以添加此过滤器选项并添加一个名为“分页”的类属性,这是我用来进行 ajax 调用的。唯一可以提供帮助的公开方法是.Header(string)
for IGridColumn<>
,老实说,它很糟糕(为了实现我的目标,我必须手动做很多事情)。所以我试图创建一个扩展方法来解决这个问题,这被证明是非常困难的,因为.Header(string)
没有暴露:
(请忽略不好的命名)
public static IGridColumn<T> Ajaxify(this IGridColumn<T> column, string columnName, string className, RouteValueDictionary routeValueDictionary)
{
string newDecoration = "<td> <a href="+GetRoute(routeValueDictionary)+"class=\""+className+"\">"+ columnName + "</a></td>";
return column.Header(newDecoration);
}
我认为我在这里的意图很干净,但是这种方法行不通,因为不知何故我无法访问该.Header(string)
方法。有任何想法吗?