Модель привязки MVC3 к плагину Dataquable в jquery при вызове ajax - PullRequest
0 голосов
/ 05 марта 2012

Я знаю несколько способов справиться с тем, что я пытаюсь сделать, но я бы хотел использовать лучший способ.Лучшее решение - наименьшее количество пользовательских / наименьших кодов.У меня есть таблица на мой взгляд, и я использую плагин 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. Оставьте все как есть, автоматически привязав мою модель к бессмысленным значениям и позже связав вручную со значимыми переменными.

1 Ответ

1 голос
/ 05 марта 2012

Я бы пошел с вариантом № 2:

Я мог бы наследовать от DefaultModelBinder и только переопределить привязка мне нужно переопределить, и разрешить привязку по умолчанию работать как нормально в большинстве случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...