2017-05-29 79 views
0

什么是跨分页保持选中复选框值的最佳实践方法?我在使用PagedList <>但是当我在第一页上选择一个项目时,导航到第二页,然后返回到第一页,所选的复选框将被取消选中。同时要IPagedList选中的复选框通过分页<>

我没有通过任何这种性质的控制,这将是为什么,但是这应该使用JavaScript来完成,或者我应该传递IPagedList回控制器?

我也尝试了以后,但我一直得到一个错误,由于不知道我应该如何传递模式在呼叫呼叫​​控制器在剃刀页面的底部。

编辑 我试图寻呼功能的PARAMATERS内通过Model,与IPagedList<VirtualMachine>作为控制器的参数类型,但是这给了我同样的错误。

我怎样才能实现跨越保持分页复选框状态,这样我可以把多个ID后面可能会或可能不会有问题的网页上?

代码

控制器:

public ActionResult VirtualMachines(string sortOrder, string currentSort, 
      int? page, int id) // tried passing IPagedList<VirtualMachine> 
     { 
      try 
      { 
       int pageSize = 10; 
       int pageIndex = 1; 
       pageIndex = page.HasValue ? Convert.ToInt32(page) : 1; 

       IPagedList<VirtualMachine> vmList = null; 
       var db = new OnAppDatabase(); 

       var vms = db.GetHypervisorVMs(id); 
       var userIds = new List<string>(); 
       foreach (var vm in vms) 
       { 
        userIds.Add(vm.user_id); 
       } 
       var usernames = db.GetUsernamesByIds(userIds); 

       foreach (var v in vms) 
       { 
        var un = usernames.FirstOrDefault(m => m.ContainsKey(v.user_id)); 
        v.user = (un == null) ? "Unknown" : un[v.user_id]; 
       } 

       for (var i = 0; i < vms.Count; i++) 
       { 
        vms[i] = GetEmailHistory(vms[i]); 
       } 

       vmList = vms.OrderBy(m => m.user).ToPagedList(pageIndex, pageSize); 

       currentSort = sortOrder; 
       ViewBag.SortOrder = sortOrder; 
       ViewBag.CurrentSort = currentSort; 
       ViewBag.Label = db.GetHypervisorLabelById(id.ToString()); 
       return View(vmList); 
      } 
      catch (Exception ex) 
      { 
      } 
     } 

剃须刀我试图去掉所有这是在页面臃肿的,下面你可以看到复选框是在每个页面上(每页十个项目)我试图保持分页中选中的复选框。

@Html.ActionLink("Hypervisors", "Hypervisors","Notification", null, new { @class = "submit-btn btn btn-yellow reverse-btn" }) 
       @using (Html.BeginForm("SendEmails", "Notification", FormMethod.Post, new { @class = "noForm" })) 
       { 
        <table class="general-table"> 
         <tr> 
          <th> 
           Select 
          </th> 
          <th> 
           VM ID 
          </th> 
          <th> 
           Hostname 
          </th> 
          <th> 
           User ID 
          </th> 
          <th> 
           User 
          </th> 
          <th> 
           Last Sent 
          </th> 
          <th> 
           Sent Type 
          </th> 
          <th> 
           Ticket ID 
          </th> 
         </tr> 
         @foreach (var item in Model) 
         { 
          <tr style="@style"> 
           <td> 
            <input type="checkbox" name="vm_ids" value="@item.id" /> 
           </td> 
           <td> 
            <a href="" style="@style">@item.id</a> 
           </td> 
           <td> 
            @Html.DisplayFor(m => item.hostname) 
           </td> 
           <td> 
            @Html.DisplayFor(m => item.user_id) 
           </td> 
           <td> 
            @Html.DisplayFor(m => item.user) 
           </td> 
           <td> 
            @Html.DisplayFor(m => item.emailSentLast) 
           </td> 
           <td> 
            @Html.DisplayFor(m => item.emailSentType) 
           </td> 
           <td> 
            <a href="" style="@style">@item.ticketId</a> 
           </td> 
          </tr> 
         } 
<div id='Paging' style="text-align: center"> 
        Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) 
        of @Model.PageCount 
        @Html.PagedListPager(Model, page => Url.Action("VirtualMachines", 
        new 
        { 
         page, 
         sortOrder = ViewBag.sortOrder, 
         Model 
        })) 
       </div> 

回答

1

想要做什么是不可能的IPagedList的基本行为,这也可能是一个坏主意。

我能想到的这里唯一的解决办法是让page链路上的事件,将所有选中的元素存储在您localStorage/array,然后当你点击你的最终提交。

+0

谢谢你的回答,但为什么它会是一个坏主意?想用'ViewBag/TempData'来存储ID数组,然后可以使用javascript或类似的方式重新填充选中的复选框,当它们出现在页面上时?否则他们可以一次提交十个,这不是一个大问题,只是探索选项。 – PurpleSmurph