2

単純な質問のように聞こえるかもしれませんが、私は今日の午後ずっとこの問題に取り組んできました。ページネーション、並べ替えなどすべてを備えた 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)。何か案は?

4

0 に答える 0