【发布时间】:2023-03-05 22:16:01
【问题描述】:
我希望在我的控制器中添加更多搜索字符串,这些字符串将在我的视图中通过分页持续存在。
目前,参数 searchString 可以在 currentFilter 中设置,只要它是唯一的参数,它就会一直存在。我希望再添加几个(searchString2、searchString3 等),但这些参数会丢失。
我正在寻找一种简单的方法来做到这一点。
学生索引:
@model PagedList.IPagedList<ContosoUniversity.Models.Student>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewBag.Title = "Students";
}
<h2>Students</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Index", "Student", FormMethod.Get))
{
<p>
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
<input type="submit" value="Search" />
</p>
}
<table class="table">
<tr>
<th>
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
First Name
</th>
<th>
@Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.FirstMidName)
</td>
<td>
@Html.DisplayFor(modelItem => item.EnrollmentDate)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
@Html.ActionLink("Details", "Details", new { id = item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.ID })
</td>
</tr>
}
</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
@Html.PagedListPager(Model, page => Url.Action("Index",
new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
学生控制器 GET:
// GET: Student
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewBag.CurrentFilter = searchString;
var students = from s in db.Students orderby s.LastName
select s;
if (!String.IsNullOrEmpty(searchString))
{
//students = students.Where(s => s.LastName.Contains(searchString)
// || s.FirstMidName.Contains(searchString));
}
switch (sortOrder)
{
case "name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "date_desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
default: // Name ascending
students = students.OrderBy(s => s.LastName);
break;
}
int pageSize = 3;
int pageNumber = (page ?? 1);
return View(students.ToPagedList(pageNumber, pageSize));
}
【问题讨论】:
-
您只需要在视图中为
SearchString2和SearchString3属性添加文本框,并在您的GET 方法中添加匹配参数以及ViewBag属性以将值传递给视图,并将值路由到PagedListPager将它们传回(与您现有的SearchString完全相同) -
嗨。我不太明白如何更改代码,以便每个有“searchString”的地方都是几个字符串。看起来它也会因为更多的参数而变得笨拙。有没有办法将参数放入列表或其他东西中,然后直接引用子对象来代替像 list
这样的 searchString?我还需要为我的 currentFilter 参数引用它,因此分页将继续工作。
标签: c# asp.net-mvc