#asp.net-mvc #model-view-controller
#asp.net-mvc #модель-представление-контроллер
Вопрос:
На моем сайте уже есть функция поиска и сортировки. Я также хотел добавить функцию фильтрации, но столкнулся с проблемой, которая заключается в том, что выпадающий список на странице просмотра не вернет значение контроллеру, который будет отфильтровывать данные, но почему-то этого не произойдет, и я не хотел жестко кодировать выпадающий список, если это возможно.
Контроллер администратора
public ViewResult Index(string sortOrder, string currentFilter, string searchString, string currentValue, string sortType, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.sortType = new SelectList(db.MembershipTypes, "MembershipTypesId", "Name");
ViewBag.CurrentType = sortType;
//sorting
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
if (searchString != null || sortType != null)
{page = 1;}
else
{
searchString = currentFilter;
sortType = currentFilter;
}
ViewBag.CurrentFilter = searchString;
var customer = from a in db.Customers.Include(c => c.MembershipTypes) select a;
var x = from b in db.MembershipTypes select b;
//search
if (!String.IsNullOrEmpty(searchString))
{
customer = customer.Where(c => c.LastName.Contains(searchString)
|| c.FirstName.Contains(searchString));
}
//sorting
switch (sortOrder)
{
case "name_desc":
customer = customer.OrderByDescending(c => c.LastName);
break;
case "Date":
customer = customer.OrderBy(c => c.DateofBirth);
break;
case "date_desc":
customer = customer.OrderByDescending(c => c.DateofBirth);
break;
default:
customer = customer.OrderBy(c => c.LastName);
break;
}
int pageSize = 3;
int pageNumber = (page ?? 1);
return View(customer.ToPagedList(pageNumber, pageSize));
}
Index.cshtml
@model PagedList.IPagedList<LeafLife.Models.Customers>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
@using (Html.BeginForm("Index", "Admin", FormMethod.Get))
{
<p>
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
@Html.DropDownList("MembershipTypesId", ViewBag.CurrentFilter as string)
<input type="submit" value="Search" />
</p>
}
<table class="table">
<tr>
<th>
MembershipTypes
</th>
<th>
Username
</th>
<th>
FirstName
</th>
<th>
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
Email
</th>
<th>
@Html.ActionLink("Date of Birth", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
Password
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.MembershipTypes.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Username)
</td>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateofBirth)
</td>
<td>
@Html.DisplayFor(modelItem => item.Password)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.IC }) |
@Html.ActionLink("Details", "Details", new { id = item.IC }) |
@Html.ActionLink("Delete", "Delete", new { id = item.IC })
</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 }))
Ответ №1:
Я решил свой собственный вопрос, решение находится в AdminController, просто добавьте другой оператор if, в котором необходимо изменить новый параметр в нем
if (!String.IsNullOrEmpty(searchVar))
{
customer = customer.Where(c => c.MembershipTypes.Name.Contains(searchVar));
}
После этого вам необходимо жестко указать значение выпадающего списка, в моем случае у меня не так много справочных данных, которые подходят для жесткого кодирования в
@Html.DropDownList("SearchVar", new List<SelectListItem>
{
new SelectListItem{ Text="Assiants", Value = "Assiants" },
new SelectListItem{ Text="Secretary", Value = "Secretary" },
new SelectListItem{ Text="Ambassador", Value = "Ambassador" }
}, "Select", ViewBag.CurrentTypes as string)
<input type="submit" value="Search" />