2012-03-05 11 views
0

私がしようとしていることを処理する方法はいくつかありますが、私は最良の方法を使いたいと思います。最高のカスタム/最小限のコード解決策です。私は私のビューでテーブルを持っており、私はJQuery DataTables pluginを使用しています。私はJSON形式のデータをサーバーから取得できるようにするプラグインの機能を使用しています。プラグインが自分のコントローラ上で自分のActionにajaxを呼び出すと、リクエストに多くの情報が追加され、モデルにバインドできます。しかし、私はリクエスト内のキーを制御することができないので、 'sSearch_1'、 'bSearchable_1'、 'bSortable_2'などのモデルのプロパティになります。MVC3 ajaxコールでjquery DataTablesプラグインにモデルをバインドする

このように...

public JsonResult CompanyList(JQueryDataTableParamModel param){ 
     var allCompanies = DataRepository.GetCompanies(); 
     IEnumerable<Company> filteredCompanies; 
     //Check whether the companies should be filtered by keyword 
     if (!string.IsNullOrEmpty(param.sSearch)) 
     { 
      //Optionally check whether the columns are searchable at all 
      var isNameSearchable = param.bSearchable_1; // Convert.ToBoolean(Request["bSearchable_1"]); 
      var isAddressSearchable = param.bSearchable_2; // Convert.ToBoolean(Request["bSearchable_2"]); 
      var isTownSearchable = param.bSearchable_3; //Convert.ToBoolean(Request["bSearchable_3"]); 

      filteredCompanies = DataRepository.GetCompanies() 
       .Where(c => isNameSearchable && c.Name.ToLower().Contains(param.sSearch.ToLower()) 
          || 
          isAddressSearchable && c.Address.ToLower().Contains(param.sSearch.ToLower()) 
          || 
          isTownSearchable && c.Town.ToLower().Contains(param.sSearch.ToLower())).ToList(); 
     } 
     else 
     { 
      filteredCompanies = allCompanies.ToList(); 
     } 

     var isNameSortable = param.bSortable_1; 
     var isAddressSortable = param.bSortable_2; 
     var isTownSortable = param.bSortable_3; 
     var sortColumnIndex = param.iSortCol_0; 
     Func<Company, string> orderingFunction = (c => sortColumnIndex == 1 && isNameSortable ? c.Name : 
                 sortColumnIndex == 2 && isAddressSortable ? c.Address : 
                 sortColumnIndex == 3 && isTownSortable ? c.Town : 
                 ""); 

     //var sortDirection = Request["sSortDir_0"]; // asc or desc 
     filteredCompanies = param.sSortDir_0 == "asc" ? filteredCompanies.OrderBy(orderingFunction).ToList() : filteredCompanies.OrderByDescending(orderingFunction).ToList(); 

     var displayedCompanies = filteredCompanies.Skip(param.iDisplayStart).Take(param.iDisplayLength); 
     var result = from c in displayedCompanies select new[] { Convert.ToString(c.ID), c.Name, c.Address, c.Town }; 
     return Json(new 
         { param.sEcho, 
          iTotalRecords = allCompanies.Count(), 
          iTotalDisplayRecords = filteredCompanies.Count(), 
          aaData = result 
         }, 
        JsonRequestBehavior.AllowGet); 
    } 

    public ActionResult Detail() { 
     return View(); 
    } 

} 

あなたはこの例では見ることができるように

は、私がモデルから値を引っ張ってきたいくつかの場所を持っている、と同じ型の変数に設定されますが、より意味のある名前で。これにより私のコードは読みやすくなりますが、冗長です。例えば:私がやりたい何

var isNameSearchable = param.bSearchable_1; 

は、「IsNameSearchable」私のモデルのプロパティを作成し、それがbSearchable_1 'にバインドする必要があります。

私はこれらのオプションを用意しました: 1.私はIModelBinderを実装するカスタムモデルバインダーを作成できますが、完全なモデルバインディングを行う必要があります。デフォルトモデルがたくさんあります私がやりたいことに対してはまだ機能します。 2.私はDefaultModelBinderから継承することができ、オーバーライドする必要があるバインディングをオーバーライドするだけで、ほとんどの場合、デフォルトのバインディングが正常に機能するようにします。 3.モデルを無意味な値に自動的にバインドし、後で意味のある変数に手動でバインドする方法をそのままにしておきます。

答えて

1

私はオプション番号2となるだろう:

私はDefaultModelBinderから継承する、とだけ私はオーバーライドする必要が結合 をオーバーライドし、ほとんどの場合、通常の として動作するようにデフォルトのバインディングを可能性があります。

関連する問題