我知道一些方法來處理我想要做的事情,但我想用最好的方法。最好的自定義/最少代碼解決方案。我的視圖中有一張桌子,我正在使用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.讓我們擁有它,將我的模型自動綁定到無意義的值,並在稍後手動綁定到有意義的變量。