【问题标题】:How to fix search functionality in mvc如何修复 mvc 中的搜索功能
【发布时间】:2019-04-03 14:16:04
【问题描述】:

我的搜索功能不起作用。当我运行应用程序时,它会很好地显示记录

在搜索框中输入后显示所有记录,不过滤

这曾经在我实现我的 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 && 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 && 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);
            }

        }

我希望搜索过滤器记录,但它什么也没做

【问题讨论】:

  • 欢迎来到 StackOverflow。为了帮助您,我们必须了解很多代码。您可以使用调试来缩小问题的范围吗?例如,浏览器发送的表单值是什么?那些是否正确转换为您的 Index 方法的参数(例如 searchString 是否为空?当您说它“什么都不做”时,您能更具描述性吗?
  • 很抱歉有很多代码。我们我说它什么都不做我的意思是页面只是刷新而不进行过滤

标签: c# .net asp.net-mvc entity-framework


【解决方案1】:

您已设置:

        searchString = "";

因此,您的员工要么被过滤到 JobTitle 为“”的员工,要么被过滤为 FirstName 或 LastName 以“”开头(每个字符串都以“”开头)的员工。

【讨论】:

  • 感谢您的回复。当我删除该行时,我得到一个“System.ArgumentNullException:值不能为空”
  • @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 为空,它将为 searchString 分配一个默认值“”。

【讨论】:

  • 谢谢,但现在它只按名称过滤,当我尝试按标题过滤时它不起作用,它只是再次返回所有记录
  • 尝试调试一下,看看你的控制器的 searchBy 参数在通过 Title @kgosi.itachi 搜索时得到什么值
  • 我发现了问题。它过滤它只是不过滤,但过滤后的记录位于列表的底部,因此除非您直接位于记录的底部,否则您看不到它
猜你喜欢
  • 2020-04-02
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多