5

KendoUIグリッドを使用してデータを表示しています。サーバーページングが魅力のように機能しています。剣道グリッドの各ページ変更はサーバーへの新しいajaxリクエストであり、サーバーは正しいページのデータを返します。サーバー側で並べ替えを実行しようとしていますが、モデルのバインドを並べ替えの値にバインドするのに問題があります。

剣道グリッドからのリクエストは次のようになります。

私のアクションメソッドは次のようになります。

public JsonResult GetReports(int pageSize, int skip, List<KendoSort> sort)
{
    // sort is not being populated with the right data.
}

KendoSortはカスタムクラスです:

public class KendoSort
{
    public string Field { get; set; }
    public string Dir { get; set; }
}

私はこれを正しく行っていないことを知っています。並べ替えに提供されたデータを正しくキャプチャするには、アクションメソッドをどのように表示する必要がありますか?スクリーンショットは、並べ替えコレクション内の1つのアイテムのみを示していますが、グリッドはそれ以上通過する可能性があります。たとえば、追加の並べ替えを含めることもできます。

sort[1][field]: reportName
sort[1][dir]: asc

基本的には、「IDで昇順で並べ替え、次にreportNameで昇順で並べ替える」という意味になります。Requestパラメータを調べたり手動で解析したりせずに、このデータをアクションメソッドに取り込むにはどうすればよいですか?

4

2 に答える 2

6

ASP.NET MVCモデルバインダーは、のような式を理解しませんsort[0][field]。前者の形式でネストされたオブジェクトを送信するsort[0].fieldため、どちらが不幸かだけを理解します。jQuery.ajax

この問題を解決するには、次の2つの方法があります。

  1. ASP.NETMVC用のKendoUICompleteを使用します。グリッドリクエスト用のモデルが組み込まれています。詳細については、こちらをご覧ください
  2. parameterMapを作成し、ソート式を変換します。

    parameterMap: function(options) {
         var result = {
           pageSize: options.pageSize,
           skip: options.skip
         };
    
         if (options.sort) {
             for (var i = 0; i < options.sort.length; i++) {
                result["sort[" + i + "].field"] = options.sort[i].field;
                result["sort[" + i + "].dir"] = options.sort[i].dir;
             }
         }
    
         return result;
    }
    

質問の作者からの更新:

最終的にはパラメーターマップを使用しましたが、並べ替えフィールドを再構築するのではなく、オプションを文字列化し、CRUDトランスポートでcontentTypeを指定しました。モデルバインダーは、contentTypeが指定されている限り、文字列化されたJSONにバインドすることを認識しています。

transport: {
    read: {
        url: '...',
        type: 'POST',
        contentType: 'application/json'
    },
    update: {
        url: '...',
        type: 'POST',
        contentType: 'application/json'
    },
    destroy: {
        url: '...',
        type: 'POST',
        contentType: 'application/json'
    },
    create: {
        url: '...',
        type: 'POST',
        contentType: 'application/json'
    },
    parameterMap: function (options, type) {
        return JSON.stringify(options);
    }
}
于 2012-10-22T08:33:57.587 に答える
3

を使用して別のスレッドから回答を見つけましたIDictionary<string, string>[] sort。これは、サーバー側で並べ替え基準をキャプチャするための最もエレガントでクリーンな方法のようです。サンプルコードが示すように、カスタムモデルバインダーは使用しません。IDictionary配列を使用して並べ替え基準を取得し、その基準を自分のデータソースに適用するだけです。そのディスカッションスレッドへのリンクは次のとおりです。IDictionary配列を使用してKendoUIの並べ替え条件をキャプチャする

于 2012-11-14T19:20:25.437 に答える