Как фильтровать данные с помощью выпадающего списка в mvc

#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" />