使MVCContrib生成的列名称进行ajax调用

时间:2012-07-06 21:26:23

标签: asp.net-mvc-3 mvccontrib mvccontrib-grid

这听起来像一个简单的问题,但整个下午我一直在为它而苦苦挣扎。我正试图在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创建的表头来添加这个过滤器选项并添加一个名为“paging”的类属性,这是我用来进行ajax调用的。对于.Header(string)来说,唯一可以提供帮助的方法是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)方法。有什么想法吗?

0 个答案:

没有答案