Я знаю несколько способов справиться с тем, что я пытаюсь сделать, но я бы хотел использовать лучший способ.Лучшее решение - наименьшее количество пользовательских / наименьших кодов.У меня есть таблица на мой взгляд, и я использую плагин JQuery DataTables .Я использую функцию плагина, которая позволяет ему получать данные в формате JSON с сервера.Когда плагин вызывает ajax мой Action на моем контроллере, он добавляет много информации к запросу, который я могу привязать к модели.Тем не менее, я не могу управлять ключами в запросе, поэтому я получаю свойства моей модели, такие как 'sSearch_1', 'bSearchable_1', 'bSortable_2' и т. Д.Метод выглядит следующим образом ...
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. Я знаю, что могу создать пользовательское связующее Model, которое реализует IModelBinder, но тогда мне нужно будет выполнить полное связывание модели, и есть много связываний модели по умолчанию, которые все еще будут работать для того, что я хочуделать.2. Я мог бы наследовать от DefaultModelBinder и переопределить только привязку, которую мне нужно переопределить, и позволить привязке по умолчанию работать как обычно в большинстве случаев.3. Оставьте все как есть, автоматически привязав мою модель к бессмысленным значениям и позже связав вручную со значимыми переменными.