如何将列表添加到<string>其他字符串以筛选 ASP.NET MVC C# 的结果?



我已经被困了一天多了,这让我抓狂。我不知道我做错了什么,也不知道我错过了什么。无论如何,我有一个使用ASP身份框架的用户列表页面。我在页面顶部有一些过滤器,它们将按以下方式过滤用户:用户名(txtbox(、公司名称(下拉列表(和角色(下拉菜单(。我当前的代码正在过滤它,但如果其他条件使用多个过滤器(如CompanyName和Role(,它就不会用其他条件过滤它。我必须查询一个List字符串来填充我的模型以显示在视图中。所以我的问题是,我很难弄清楚如何添加";角色"(它是List字符串(到我的控制器代码,该代码将来自过滤器的3个字符串合并在一起。但由于角色已经是一个字符串,如果我放。ToString((之后,当被触发时,过滤器将不会显示任何记录。如果我接受。ToString((,它只在我自己过滤角色的情况下有效,但它不能与其他过滤器一起工作。如果对我能做些什么有任何建议,我们将不胜感激。这是我的型号:

public class UserList
{
public UserList() { }
public ApplicationUser User { set; get; }
public List<string> Roles { get; set; }
}

这是我的观点:

@using (Html.BeginForm("ListUsers", "Administrator", FormMethod.Get))
{
<div class="form-inline title">
<h4>Users</h4>
<button class="create-btn"><span class="fa-solid fa-plus"></span>&nbsp;@Html.ActionLink("Create New User", "Register", "Account", new { @class = "CreateLink" })</button>
</div>
<p class="filter-section">
<label class="filter-lbl1">By Company:</label><label class="filter-ddl">@Html.DropDownList("strComp", Extensions.GetCompanyList(), "All", new { @class = "comp-ctl" })</label>
<label class="filter-lbl2">By Role:</label><label class="filter-ddl">@Html.DropDownList("strRole", Extensions.GetRolesList(), "All", new { @class = "role-ctn" })</label><br />
<label class="filter-lbl3">By User Name:</label><label class="filter-txtbox">@Html.TextBox("strName", "", new { @class = "name-ctl" })</label>
<button type="button" class="red" onclick="location.href='@Url.Action("ListUsers", new { })'"><i class="fa solid fa-trash-o"></i>&nbsp;&nbsp;Reset</button>
<button type="submit" class="filter-btn"><i class="fa solid fa-filter"></i>&nbsp;&nbsp;Filter</button>
</p>
}
<table class="table">
<tr>
<th>
Email
</th>
<th>
Company
</th>
<th>
Role
</th>
<th>
Last Login
</th>
<th></th>
</tr>
@foreach (var user in Model)
{
var appUser = user.User;
var roles = user.Roles;
<tr>
<td class="email">
@Html.HiddenFor(modelitem => user.User.Id)
@Html.DisplayFor(modelitem => user.User.Email)
</td>
<td>
@Html.DisplayFor(modelitem => user.User.CompanyName)
</td>
<td>
@Html.DisplayFor(modelitem => user.Roles, string.Join(",", roles))
</td>
<td>
</td>
<td>
@Html.ActionLink("Edit", "EditUser", new { id = appUser.Id }, new { @class = "edit-link" }) |
@Html.ActionLink("Delete", "DeleteUser", new { id = appUser.Id }, new { @class = "delete-link" })
</td>
</tr>
}
</table>
<link href="~/Content/PagedList.css" rel="stylesheet" />
<div></div>
Page @(Model.PageCount < Model.PageNumber ? 0: Model.PageNumber)/@Model.PageCount
@Html.PagedListPager(Model, page => Url.Action("ListUsers", new { page, strComp = ViewData["strFilter1"], strRole = ViewData["strFilter2"], strName = ViewData["strFilter3"] }))

这是我的控制器部分的代码:

public ActionResult ListUsers(string strFilter1, string strFilter2, string strFilter3, string strComp, string strName, string strRole, int? page)
{
if (strComp != null && strRole != null && strName != null)
{
strFilter1 = strComp;
strFilter2 = strRole;
strFilter3 = strName;
}
ViewBag.strFilter1 = strComp;
ViewBag.strFilter2 = strRole;
ViewBag.strFilter3 = strName;
var user = (from u in context.Users
let query = from ur in context.Set<IdentityUserRole>()
where ur.UserId.Equals(u.Id)
join r in context.Roles on ur.RoleId equals r.Id
select r.Name
select new UserList() { User = u, Roles = query.ToList<string>() })
.ToList();
if (!String.IsNullOrEmpty(strComp))
{
//Filter results based on company selected.
var pageNumber = page ?? 1;
var pageSize = 25;
if (strRole == null && strName == null)
{
var comp = user.Where(u => u.User.CompanyName.ToString().Contains(strComp));
return View(comp.OrderBy(u => u.User.Id).ToPagedList(pageNumber, pageSize));
}
else
{
var compuser = user.Where(u => u.User.CompanyName.ToString().Contains(strComp) &&
u.Roles.ToString().Contains(strRole) &&
u.User.UserName.ToString().Contains(strName));
return View(compuser.OrderBy(u => u.User.Id).ToPagedList(pageNumber, pageSize));
}
}
if (!String.IsNullOrEmpty(strRole))
{
//Filter results based on role selected.
var pageNumber = page ?? 1;
var pageSize = 25;
if (strComp == null && strName == null)
{
var roll = user.Where(u => u.Roles.Contains(strRole));
return View(roll.OrderBy(u => u.User.Id).ToPagedList(pageNumber, pageSize));
}
else
{
var rolluser = user.Where(u => u.Roles.Contains(strRole) &&
u.User.CompanyName.ToString().Contains(strComp) &&
u.User.UserName.ToString().Contains(strName));
return View(rolluser.OrderBy(u => u.User.Id).ToPagedList(pageNumber, pageSize));
}
}
if (!String.IsNullOrEmpty(strName))
{
//Filter results based on the username typed in.
var pageNumber = page ?? 1;
var pageSize = 25;
if (strComp == null && strRole == null)
{
var uname = user.Where(u => u.User.UserName.ToString().Contains(strName));
return View(uname.OrderBy(u => u.User.Id).ToPagedList(pageNumber, pageSize));
}
else
{
var nameuser = user.Where(u => u.User.UserName.ToString().Contains(strName) &&
u.User.CompanyName.ToString().Contains(strComp) &&
u.Roles.ToString().Contains(strRole));
return View(nameuser.OrderBy(u => u.User.Id).ToPagedList(pageNumber, pageSize));
}
}
//var userList = user.OrderBy(u => u.User.Id).ToList();
{
var pageNumber = page ?? 1;
var pageSize = 25;
var userList = user.OrderBy(u => u.User.CompanyName).ToList();
return View(userList.ToPagedList(pageNumber, pageSize));
}
}

控制器是我认为问题所在的地方。如果我离开。ToString((,如果我只是根据角色进行筛选,它的效果非常好。但如果我尝试使用其他内容进行筛选,它会将其筛选为空结果。我认为,由于角色是一个列表字符串,出于某种原因,它无法正确添加到其他字符串中。奇怪的是,在我当前的代码中,它会同时按用户名和角色过滤记录,但CompanyName和Role并不同步工作。

我认为您想要的逻辑是Enumerable.Any

例如,您的角色Where子句可以是:

u.Roles.Any(role => role.Contains(strRole)))

如果任何一个CCD_ 4包含指定的CCD_。


编辑:旁注,如果我读对了,user声明后的所有代码都可以简化为:

public ActionResult ListUsers(/*...*/)
{
var user = /*...*/;
var pageNumber = page ?? 1;
var pageSize = 25;
IEnumerable<ApplicationUser> filteredUsers = user;
if (!String.IsNullOrEmpty(strComp)) {
filteredUsers = filteredUsers.Where(u => u.User.CompanyName.ToString().Contains(strComp));
}
if (!String.IsNullOrEmpty(strName)) {
filteredUsers = filteredUsers.Where(u => u.User.UserName.ToString().Contains(strName));
}

if (!String.IsNullOrEmpty(strRole)) {
filteredUsers = filteredUsers.Where(u => u.Roles.Any(role => role.Contains(strRole)));
}

return View(filteredUsers.OrderBy(u => u.User.Id).ToPagedList(pageNumber, pageSize));
}

最新更新