我已經堅持了一天多,這讓我發瘋了。我不知道我做錯了什么或我錯過了什么。無論如何,我有一個使用 ASP 身份框架的用戶串列頁面。我在頁面頂部有一些過濾器,它們將按以下方式過濾用戶:UserName(txtbox)、CompanyName(dropdown) 和 Role(dropdown)。我當前的代碼正在過濾它,但如果它們使用多個過濾器(如 CompanyName 和 Role),它不會使用其他條件過濾它。我必須查詢一個串列字串來填充我的模型以顯示在視圖中。因此,我無法弄清楚的問題是如何將“角色”(即串列字串)添加到將過濾器中的 3 個字串合并在一起的控制器代碼中。但是由于 Roles 已經是一個字串,如果我把 .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> @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> Reset</button>
<button type="submit" class="filter-btn"><i class="fa solid fa-filter"></i> 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() 從角色中移除,那么如果我只是按角色進行過濾,它就可以完美地作業。但是,如果我嘗試使用其他任何內容進行過濾,它會將其過濾為空結果。我在想,因為 Roles 是一個串列字串,由于某種原因它無法正確添加到其他字串。奇怪的是我當前的代碼,它會同時按 UserName 和 Role 過濾記錄,但是 CompanyName 和 Role 不能相互同步。
uj5u.com熱心網友回復:
我認為你想要的邏輯是Enumerable.Any.
例如,您Where的角色條款可以是:
u.Roles.Any(role => role.Contains(strRole)))
如果其中任何一個u.Roles包含指定的strRole字串,這將回傳 true。
編輯:旁注,如果我沒看錯的話,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));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/518279.html
