【问题标题】:ASP.NET MVC 4 Search FormASP.NET MVC 4 搜索表单
【发布时间】:2015-03-07 00:34:49
【问题描述】:

我被困住了。我正在尝试执行一个简单的搜索表单,它不会返回任何结果。

这是我的控制器:

public ActionResult search(FormCollection frmCollection)
    {

        var search = frmCollection["searchString"];
        List<JobViewModel> lst = new List<JobViewModel>();

        var result = from a in db.jobs
                     join b in db.jobcategories on a.category_id equals b.id
                     join c in db.jobstatus on a.status_id equals c.id
                     select new
                     {
                         id = a.id,
                         title = a.title,
                         category_id = a.category_id,
                         category_name = b.name,
                         city = a.city,
                         state = a.state,
                         zip = a.zip,
                         status_id = a.status_id,
                         status_name = c.name,
                         description = a.description,
                         qualifications = a.qualifications,
                         required_education = a.required_education,
                         application_link = a.application_link


                     };
        if (!String.IsNullOrEmpty(search))
        {
            result = result.Where(s => s.title.Contains(search));
        }


        foreach (var item in result)
        {
            var JobModel = new JobViewModel
            {
                id = item.id,
                title = item.title,
                category_id = item.category_id,
                category_name = item.category_name,
                city = item.city,
                state = item.state,
                zip = item.zip,
                status_id = item.status_id,
                status_name = item.status_name,
                description = item.description,
                qualifications = item.qualifications,
                required_education = item.required_education,
                application_link = item.application_link
            };
            lst.Add(JobModel);
        }

        return View("SearchResults", lst.AsQueryable());
    }

这是我的搜索表单:

@Html.ActionLink("View All Positions", "ListAll")

@using (Html.BeginForm("search", "JobSearchController", "search"))
{
    <p>
        Search: @Html.TextBox("searchString")
        <input class="btn btn-primary btn-sm" type="submit" value="search" />
    </p>
}

这是我的结果页面:

@model IEnumerable<Viaero.Next.Mvc.Models.JobViewModel>

RESULTS: @Model.Count()
POST: @Request["searchString"]

@if (Model.Count() > 0)
{
    <table class="table table-hover">
        <tbody>
            @foreach (var o in Model)
            {
                <tr>
                    <td>
                        <span style="font-weight: bold"><a href="/about-viaero-wireless/careers/details/@o.id">@o.title</a></span><br /><br />
                        @(o.city + ", " + o.state)
                    </td>
                    <td><a class="btn btn-success btn-sm" target="_blank" href="@o.application_link">APPLY</a></td>
                </tr>
            }
        </tbody>
    </table>
}
else
{
    <p>Sorry, there are no results.  Please try again.</p>
}

问题是,无论我在搜索框中输入什么内容,我都会得到零个结果。但是,如果我用 where a.title.Contains("Some String")" 替换 "where a.title.Contains(search)" 它每次都有效。

我已经验证了文本框的值正在传递给视图,并且控制器可以看到它,但它仍然不起作用。有什么建议吗?

【问题讨论】:

  • 你能验证var result = (from a in db.jobs where a.title.Contains(search) select a).ToList();返回任何结果吗?
  • @Win - 这不会返回任何结果。我在搜索框中输入了“HVAC”。但是,如果我使用var result = (from a in db.jobs where a.title.Contains("HVAC") select a).ToList();,它会起作用。
  • 也许反向搜索并尝试 search.Contains(a.Title)。这也有部分匹配的好处,即“HVAC 服务”应该匹配“HVAC”或“服务”或“HVAC 服务”。但是,我认为您的搜索字符串没有被传递。此外,您应该搜索 Jobs,然后加入其余的表。为什么要加入您不打算使用的结果数据?
  • @Steven 你能用 Trim() 测试吗? var search = frmCollection["searchString"].Trim(); var result = (from a in db.jobs where a.title.Contains(search) select a).ToList(); 如果还是不行,在var search = ...设置断点,查看search可能是searchString的值为null。
  • @Win - 我已尝试使用 Trim() ,但它仍然无法正常工作。当我调试应用程序时,我可以看到输入到搜索框中的值被分配给搜索变量。

标签: asp.net asp.net-mvc razor sitefinity


【解决方案1】:

由于某种原因,添加 SQL 通配符不起作用,但是,以下操作确实有效。

var result = (from a in db.jobs select a).AsEnumerable();
result = result.Where(x => x.title.Contains(String.Format("{0}",search)));

【讨论】:

  • 我认为这是因为当你通过 var search = frmCollection["searchString"]; 声明 search 时,你创建的是一个对象,而不是一个字符串。 String.Format 将其转换为字符串。
【解决方案2】:

我的猜测是搜索变量实际上是null,所以你没有得到任何匹配。尝试将传入参数更改为 searchString。这应该让您了解表单变量是否映射到参数。

public ActionResult search(string searchString)

【讨论】:

  • 我可以调试并查看我在搜索框中输入的值被分配给搜索变量。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2013-07-04
  • 2011-03-28
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 2013-12-21
  • 2011-02-15
相关资源
最近更新 更多