2013-09-24 5 views
0

Я использую datatables с обработкой на стороне сервера.jQuery datatable Следующая кнопка работает некорректно

Моя проблема: кнопка «Далее» из меню разбиения на страницы работает некорректно.

Если выбрана страница № 1, Далее работает ОК; если выбрана страница № 2, нажатие затем делает страницу загрузки таблицы 102 (параметр iDisplayStart установлен на 1010 вместо 20).

Это мой код инициализации:

oTable = $('#solutionsTable').dataTable({ 
     "bJQueryUI": true, 
     "sPaginationType": "full_numbers", 
     "bSort": false, 
     "oLanguage": { 
      "sSearch": "Search all columns:" 
     }, 
     "bProcessing": true,    
     "bServerSide": true, 
     "sAjaxSource": '@Url.Action("AsyncGetUserData")',   
     "bDeferRender": true, 
     "aoColumns": [         
      //User 
      { "mData": function(source, type, val){ 
       var returnString = "<b>Name: </b>" +"<span>" + source.userName + "</span>" +  
        "<br/><b>Type: </b>" + "<span>" + source.roleName + "</span><br/>" + 
        "<b>Status: </b>" + "<span>" + source.isActive + "</span>"; 
       return returnString; 
      }}, 

    ................................... 

      //Options 
      { "mData": function(source, type, val){ 
       var editUrl = '@Url.Action("Account", "CMS")' + '?userId=' + source.userID; 

       var returnString = "<a href=" + editUrl + ">Edit</a>" + "/" + 
        "<a href=\"#\" onclick=\"postDelete('" + source.userID +"')\">Delete</a>"; 
       return returnString; 
      }} 
     ] 
    }).fnSetFilteringDelay(); 

И это мой контроллер действия:

public ActionResult AsyncGetUserData(jQueryDataTableParamModel param) 
    {   
     var allUsers = CMSHelper.GetUsers(countries: User.IsInRole("Account Admin") ? CMSHelper.GetAdminCountries(User.Identity.Name).Select(c => c.Key).ToList() : null); 
     IEnumerable<UserModel> filteredResults = null; 
     string filterLowerCase = ""; 
     string userFilter = ""; 
     string activityFilter = ""; 
     string contactFilter = ""; 
     string workFilter = ""; 
     string addressFilter = ""; 

     if (!String.IsNullOrWhiteSpace(param.sSearch)) 
      filterLowerCase = param.sSearch.ToLower(); 
     if (!String.IsNullOrWhiteSpace(Request["sSearch_0"].ToString())) 
      userFilter = Request["sSearch_0"].ToString().ToLower(); 
     if (!String.IsNullOrWhiteSpace(Request["sSearch_1"].ToString())) 
      activityFilter = Request["sSearch_1"].ToString(); 
     if (!String.IsNullOrWhiteSpace(Request["sSearch_2"].ToString())) 
      contactFilter = Request["sSearch_2"].ToString().ToLower(); 
     if (!String.IsNullOrWhiteSpace(Request["sSearch_3"].ToString())) 
      workFilter = Request["sSearch_3"].ToString().ToLower(); 
     if (!String.IsNullOrWhiteSpace(Request["sSearch_4"].ToString())) 
      addressFilter = Request["sSearch_4"].ToString().ToLower(); 

     if (!String.IsNullOrWhiteSpace(param.sSearch)) 
      filteredResults = allUsers.Where(f => f.userName.ToLower().Contains(filterLowerCase) 
       || f.firstName.ToLower().Contains(filterLowerCase) 
       || f.lastName.ToLower().Contains(filterLowerCase) 
       || (f.City == null ? "N/A" : f.City).ToLower().Contains(filterLowerCase) 
       || (f.company == null ? "N/A" : f.company).ToLower().Contains(filterLowerCase) 
       || f.countryName.ToLower().Contains(filterLowerCase) 
       || f.email.ToLower().Contains(filterLowerCase) 
       || (f.job == null ? "N/A" : f.job).ToLower().Contains(filterLowerCase) 
       || f.LastLogin.ToString().Contains(filterLowerCase) 
       || f.LoginsNum.ToString().Contains(filterLowerCase) 
       || (f.phone == null ? "N/A" : f.phone).ToLower().Contains(filterLowerCase) 
       || (f.Postcode == null ? "N/A" : f.Postcode).ToLower().Contains(param.sSearch) 
       || (f.Street == null ? "N/A" : f.Street).ToLower().Contains(filterLowerCase) 
       || f.type.ToLower().Contains(filterLowerCase) 
       || (f.isActive == true ? "active" : "inactive").Contains(filterLowerCase)).Select(f => f); 
     else 
      filteredResults = allUsers; 

     if (!String.IsNullOrWhiteSpace(userFilter)) 
      filteredResults = filteredResults.Where(f => f.userName.ToLower().Contains(userFilter) 
       || f.type.ToLower().Contains(userFilter) 
       || (f.isActive == true ? "active" : "inactive").Contains(userFilter)); 

     if (!String.IsNullOrWhiteSpace(activityFilter)) 
      filteredResults = filteredResults.Where(f => f.LoginsNum.ToString().Contains(activityFilter) 
       || f.LastLogin.ToString().Contains(activityFilter)); 

     if (!String.IsNullOrWhiteSpace(contactFilter)) 
      filteredResults = filteredResults.Where(f => f.firstName.ToLower().Contains(contactFilter) 
       || f.lastName.ToLower().Contains(contactFilter) 
       || f.email.ToLower().Contains(contactFilter) 
       || (string.IsNullOrEmpty(f.phone) ? "N/A" : f.phone).ToLower().Contains(contactFilter)); 

     if (!String.IsNullOrWhiteSpace(workFilter)) 
      filteredResults = filteredResults.Where(f => (f.company == null ? "N/A" : f.company).ToLower().Contains(workFilter) 
       || (f.job == null ? "N/A" : f.job).ToLower().Contains(workFilter)); 

     if (!String.IsNullOrWhiteSpace(addressFilter)) 
      filteredResults = filteredResults.Where(f => f.countryName.ToLower().Contains(addressFilter) 
       || (f.City == null ? "N/A" : f.City).ToLower().Contains(addressFilter) 
       || (f.Street == null ? "N/A" : f.Street).ToLower().Contains(addressFilter) 
       || (f.Postcode == null ? "N/A" : f.Postcode).ToLower().Contains(addressFilter));   

     var displayedUsers = filteredResults.Skip(param.iDisplayStart).Take(param.iDisplayLength); 

     var result = from u in displayedUsers 
        select new 
        { 
         userID = Convert.ToString(u.userId), 
         userName = u.userName,        
         roleName = u.type, 
         isActive = u.isActive == true ? "Active" : "Inactive", 
         firstName = u.firstName, 
         lastName = u.lastName, 
         email = u.email, 
         phone = (u.phone == null ? "N/A" : u.phone), 
         postcode = (u.Postcode == null ? "N/A" :u.Postcode), 
         street = (u.Street == null ? "N/A" : u.Street), 
         company = (u.company == null ? "N/A" : u.company),        
         job = (u.job == null ? "N/A" : u.job),        
         countryName = u.countryName, 
         city = (u.City == null ? "N/A" : u.City), 
         loginsNum = u.LoginsNum.ToString(), 
         lastLogin = u.LastLogin.ToString() 
        }; 

     return Json(new 
     { 
      sEcho = int.Parse(param.sEcho), 
      iTotalRecords = allUsers.Count(), 
      iTotalDisplayRecords = filteredResults.Count(),    
      aaData = result 
     }, JsonRequestBehavior.AllowGet);   
    } 

Я искал форум DataTables и мог найти ничего подобного. Если вы встречали эту проблему раньше или имели какие-либо идеи, что может быть причиной, сообщите мне. Благодарю.

ответ

0

Я нашел проблему: Я реализовал fnLengthChange, в котором был испорчен параметр iDisplayStart; Мне было необходимо, чтобы программно изменить количество записей, показанных как часть механизма svae состояния, используя файлы cookie; Я удалил реализацию fnLengthChange и использовал сохранение состояния с использованием локального хранилища, и теперь он отлично работает.

http://datatables.net/blog/localStorage_for_state_saving

Смежные вопросы