2012-03-05 22 views
0

我知道一些方法來處理我想要做的事情,但我想用最好的方法。最好的自定義/最少代碼解決方案。我的視圖中有一張桌子,我正在使用JQuery DataTables plugin。我使用的插件功能允許它從服務器獲取JSON格式的數據。當插件在我的控制器上對我的Action執行ajax調用時,它會將大量信息添加到可以綁定到模型的請求上。然而,我無法控制請求中的密鑰,所以我最終在我的模型上有'sSearch_1','bSearchable_1','bSortable_2'等屬性...MVC3將模型綁定到jQuery數據表插件上ajax調用

因此,我的Action Method看起來像這樣...

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繼承,並且只覆蓋 結合我需要重寫,並允許默認綁定, 在大多數情況下正常工作。