c# - 在 ASP.Net MVC 中多选过滤分页 View

标签 c# asp.net-mvc razor multi-select pagedlist

在我的 MVC 5“索引” View 中,我使用了 paged list并应用过滤器,这些过滤器只是如下所示的下拉列表(按角色过滤用户列表)。

public ActionResult Index(int? roleId, int? page)
{
    var pageNumber = page ?? 1;
    var currentRoleId = roleId ?? 0;
    var Roles = db.Roles.OrderBy(r => r.Name).ToList();
    ViewBag.RoleId = new SelectList(Roles, "RoleId", "Name", currentRoleId);

    var users = db.Users;
    ViewBag.OnePageOfUsers = users.ToPagedList(pageNumber, 20); 

在我看来,我有以下内容来捕获过滤器更改,
@Html.DropDownList("RoleId", null, new { onchange = "$(this.form).submit();" })

和以下处理与选定的roleid的分页
@Html.PagedListPager((IPagedList)ViewBag.OnePageOfUsers,
        page => Url.Action("Index", new
        {
            page,
            roleId = ViewBag.RoleId.SelectedValue
        }),
        PagedListRenderOptions.ClassicPlusFirstAndLast)

这一切都很好,但是现在我想使用多选列表(按多个角色过滤),我遇到了麻烦。我已经到了可以初始化所选角色并显示列表的地步,但是当我去更改过滤器选择时,我无法弄清楚如何将选择返回给 Controller 。经过大量的反复试验,我的方法如下:

创建了一个 View 模型来保存过滤器列表和选择。
public IEnumerable<int> SelectedRoleIds { get; set; }
public MultiSelectList Roles { get; set; }

在我的 Controller 中初始化我的 ViewModel ...
public ActionResult Index(int ? page, int [] roles) 
{
    :
    model.SelectedRoleIds = new int[] { 2, 3 };// just for testing
    model.Roles = new MultiSelectList(RoleList, "RoleId", "Name", model.SelectedRoleIds);

在我看来,我现在有一个用于多选的 ListBox。
@Html.ListBoxFor(m => m.SelectedRoleIds, Model.Roles, new { multiple = "multiple", onchange = "$(this.form).submit();" })

在我看来,我尝试分配选择...
@Html.PagedListPager((IPagedList)ViewBag.OnePageOfUsers,
        page => Url.Action("Index", new
        {
            page,
           roles = Model.SelectedRoleIds
        }),
        PagedListRenderOptions.ClassicPlusFirstAndLast)

我的方法正确吗?我一直在兜圈子,有时在没有过滤的情况下进行分页工作,反之亦然。我尝试了 POST 操作,但后来我无法使分页工作。可能有更好的方法来实现我的目标。

最佳答案

总的来说,我的方法走上正轨。我缺少的关键部分是将选定的值从 View 发送到 Controller ,这意味着将一个 int 数组(比如 x[] = {1,2,3})转换为查询参数 x=1&x=2&x=3 所以它可以传回去。

这是我使用多选列表过滤 MVC 分页列表/索引 View 的简化整体解决方案。

我的 View 模型

public class UserViewModel
{
    public int [] SelectedRoleIds { get; set; }
    public MultiSelectList Roles { get; set; }
}

Controller Action
public ActionResult Index(int? page, string[] SelectedRoleIds)
{
    UserViewModel model = new UserViewModel();
    var users = db.Users;
    var pageNumber = page ?? 1;
    var RoleList = db.Roles;
    model.Roles = new MultiSelectList(RoleList, "RoleId", "Name", model.SelectedRoleIds);
    if (SelectedRoleIds != null)
        model.SelectedRoleIds = Array.ConvertAll(SelectedRoleIds, int.Parse);

    // Filter the users by role selection
    if (model.SelectedRoleIds != null)
    {
        users = users.Where(a => model.SelectedRoleIds.All(requiredId => a.Roles.Any(role => role.RoleId == requiredId)));
    }

    ViewBag.OnePageOfUsers = users.ToPagedList(pageNumber, pagesize); 

    return View(model);
}

风景
@Html.ListBoxFor(m => m.SelectedRoleIds, Model.Roles, new { multiple = "multiple", onchange = "$(this.form).submit();" })
<a href="@Url.Action("Index")" class="btn btn-info btn-xs">Reset</a>

@Html.PagedListPager((IPagedList)ViewBag.OnePageOfUsers,
    page => Url.Action("Index", new { page = page }) + 
        (Model.SelectedRoleIds == null ? "" : "&" + string.Join("&", ((int[])Model.SelectedRoleIds).Select(x => "SelectedRoleIds=" + Url.Encode(x.ToString())))))

关于c# - 在 ASP.Net MVC 中多选过滤分页 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31062645/

相关文章:

c# - GCLatencyMode.LowLatency 是一个不错的选择吗?

c# - Reflection.Typeinfo/Reflection.Type 没有 GetProperties/GetFields 方法

asp.net-mvc-3 - 创建类似于Helper.BeginForm()的MVC3 Razor Helper

c# - 向单选按钮添加文本

asp.net-mvc - 如何修复错误命名空间 'Linq'中不存在类型或命名空间名称 'System'

c# - 如何在 Dynamic Linq 中使用枚举?

c# - 为什么我在发送 SMTP 电子邮件时收到“"' 属性无法分配”?

c# - _Layout.cshtml 不能直接请求,因为它调用了 "RenderBody"方法

c# - 如何将参数传递给 ValidationAttribute?

asp.net-mvc - 无法加载 Antlr3.Runtime,HRESULT : 0x80131040