通过IPagedList中的分页保持选中的复选框<>

时间:2017-05-29 08:59:55

标签: c# asp.net-mvc razor

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

我没有将任何东西传递给这种性质的控制器,这将是原因,但是这应该用JavaScript完成还是我应该将IPagedList传递回控制器?

我确实尝试过后一段时间,但由于不知道如何将分页调用中的模型传递给剃刀页面底部的控制器,我一直收到错误。

修改 我试图在分页功能的参数中传递Model,在控制器中使用IPagedList<VirtualMachine>作为参数类型,但这给了我同样的错误。

如何在分页中保持复选框状态,以便我可以发回多个ID,这些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)
            {
            }
        }

Razor 我试图去除页面中的所有膨胀,在下面你可以看到每页上的复选框(每页十个项目)我试图保留分页中选中的复选框。

@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 个答案:

答案 0 :(得分:1)

IPagedList的基本行为无法实现您的目标,这也可能是一个坏主意。

我能想到的唯一解决方案是在page链接上设置一个事件,用于存储localStorage / array中所有已检查的元素,然后点击你的最终提交。