Как исправить функциональность поиска в mvc

#c# #.net #asp.net-mvc #entity-framework

#c# #.net #asp.net-mvc #entity-framework

Вопрос:

Моя функция поиска не работает. когда я запускаю приложение, оно будет отображать записи нормально

после ввода входных данных в поле поиска отображаются все записи без фильтрации

Раньше это работало до того, как я внедрил свою ViewModel

Мое мнение

 @model WTCoro2.Models.PersonViewModel


@{
    ViewBag.Title = "People";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>

@using (Html.BeginForm("Index", "People", FormMethod.Get))
{
    <b>Search By:</b>
    @Html.RadioButton("searchBy", "Name", true) <text>Name</text>
    @Html.RadioButton("searchBy", "Title") <text>Title</text>
   // @Html.RadioButton("searchBy", "Salary") <text>Salary</text>

    <br />
    @Html.TextBox("BusinessEntityID") <input type="submit" value="Search" />
}

<table class="table">
    <tr>
        <th>
            JobTitle
        </th>
        <th>
            @Html.DisplayNameFor(model => model.pers.First().FirstName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.pers.First().LastName)
        </th>
        <th>
            Email Address
        </th>
        <th>
           @Html.DisplayNameFor(model => model.phn.First().PhoneNumber)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.pers.First().BusinessEntity.BusinessEntityID)
        </th>
        <th></th>
    </tr>

    @if (Model.pers.Count() == 0)
    {
        <tr>
            <td colspan="7">No Record Found</td>
        </tr>
    }
    else
    {

        foreach (var item in Model.pers)
        {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Employee.JobTitle)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EmailAddresses.First().EmailAddress1)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.PersonPhones.First().PhoneNumber)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.BusinessEntity.BusinessEntityID)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.BusinessEntityID }) |
                @Html.ActionLink("Details", "Details", new { id = item.BusinessEntityID }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.BusinessEntityID })
            </td>

        </tr>
        }
    }

</table>
  

Мой поиск внутри моего контроллера

 public ActionResult Index(string sortOrder, string searchString, string currentFilter, int? page, string searchBy, string startdate = null, string enddate = null)
        {
            var mymodel = new PersonViewModel();
            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
            var people_list = mymodel.pers = db.People.ToList();
            var employee_list = mymodel.emp = db.Employees.ToList();
            var history_list = mymodel.history = db.EmployeeDepartmentHistories.ToList();
            var email_list = mymodel.emldrs = db.EmailAddresses.ToList();
            var phone_list = mymodel.phn = db.PersonPhones.ToList();
            /* if (searchString != null)
             {
                 page = 1;
             }
             else
             {
                 searchString = currentFilter;
             }
             ViewBag.CurrentFilter = searchString;*/
            searchString = "";
            if (searchBy == "Title")
            {
                mymodel.emp = (employee_list.Where(x => x.JobTitle == searchString || searchString == null).ToList());
                return View(mymodel);
            }
            /*  else if (startdate != null amp;amp; enddate != null)
              {
                  DateTime start = DateManager.GetDate(startdate) ?? DateTime.Now;
                  DateTime end = DateManager.GetDate(enddate) ?? DateTime.Now;
                  return View(history_list.Where(x => x.StartDate >= start amp;amp; x.EndDate <= end).ToList());

              }*/
            else
            {
                mymodel.pers = (people_list.Where(x => x.FirstName.StartsWith(searchString) || x.LastName.StartsWith(searchString) || searchString == null).ToList());
                return View(mymodel);
            }

        }
  

Я ожидаю, что поисковый фильтр записывает, но он просто ничего не делает

Комментарии:

1. Добро пожаловать в StackOverflow. Нам придется поработать с большим количеством кода, чтобы помочь вам. Можете ли вы использовать отладку, чтобы сузить масштаб проблемы? Например, какие значения формы отправляются браузером? Правильно ли они преобразуются в аргументы вашего метода Index (например, является searchString null? Можете ли вы быть более наглядным, когда говорите, что это «ничего не делает»?

2. извините за большой объем кода. мы, я говорю, что это ничего не делает, я имею в виду, что страница просто обновляется без выполнения фильтрации

Ответ №1:

Вы установили:

         searchString = "";
  

Таким образом, ваши сотрудники будут либо отфильтрованы до тех, чей JobTitle равен «», либо до тех, чье имя или фамилия начинаются с «» (каждая строка начинается с «»).

Комментарии:

1. Спасибо за ответ. Когда я удаляю эту строку, я получаю «System. Исключение ArgumentNullException: значение не может быть нулевым»

2. @kgosi.itachi: Это означает, что searchString на данный момент равно нулю. Я заметил, что в вашей форме нет никаких входных данных с именем «searchString». Вы ожидали, что searchString будет иметь значение? Откуда вы ожидали получить это значение? Какого поведения вы ожидали, когда searchString не имеет значения? Вы научились пошагово просматривать свой код и проверять переменные в отладчике, чтобы понять, что происходит во время выполнения?

Ответ №2:

Сначала удалите

 searchString = "";
  

Поскольку эта строка сбрасывает любое значение, которое вы передаете в контроллер, как пустое. Затем измените подпись вашего контроллера на

  public ActionResult Index(string sortOrder, string searchString = "", string currentFilter, int? page, string searchBy, string startdate = null, string enddate = null)
  

который присвоит searchString значение по умолчанию «», если оно равно null.

Комментарии:

1. Спасибо, это сработало, но теперь он фильтрует только по имени и не работает, когда я пытаюсь отфильтровать по названию, он просто возвращает все записи снова

2. Попробуйте отладить его и посмотрите, какое значение вы получите в параметре searchBy вашего контроллера при поиске по названию @kgosi.itachi

3. Я нашел проблему. Он просто фильтрует, но отфильтрованные записи идут внизу списка, поэтому вы не увидите их, если не перейдете прямо к нижней части записей