【问题标题】:How to make a search functionality that contains more than one word in ASP MVC4?如何在 ASP MVC4 中创建包含多个单词的搜索功能?
【发布时间】:2013-05-18 02:47:51
【问题描述】:

我有一个 model 类,其中包含

public string FirstName { get; set; }
public string LastName { get; set; }

控制器我有

 public ActionResult Index(string search)
        {
            ViewBag.Message = "Your contacts.";

            var model = _db.Contacts
                        .OrderBy(c => c.FirstName)
                        .Where(c => search == null || c.FirstName.StartsWith(search) || c.LastName.StartsWith(search))
                        .Take(5)
                        .Select(c => new ContactsListViewModel
                        {
                            ContactId = c.ContactId,
                            FirstName = c.FirstName,
                            LastName = c.LastName,
                            Address = c.Address,
                            City = c.City,
                            Phone = c.Phone,
                            Email = c.Email

                        });



            if (Request.IsAjaxRequest())
            {
                return PartialView("_Contacts", model);
            }

            return View(model);
        }

到目前为止,我设法分别按名字和姓氏进行搜索。 例如,如果我输入 John,我会很好地获得与 John 相关的所有信息。与姓氏相同。 所以我有一个问题,我如何实现搜索功能,以便用户可以在一个输入表单中输入例如名字和姓氏,并且会出现相关表格?

非常感谢您的帮助。谢谢

感谢 Raphaël Althaus 的回答。但我的视图中已经有一个搜索表单

<form method="get" action="@Url.Action("Index")"
    data-otf-ajax="true" data-otf-target="#contactList">
    <input type="search" name="search" data-otf-autocomplete="@Url.Action("Autocomplete", "Contacts")" />
    <button type="submit" class="btn">Search</button>
</form>

看来,您提供的是在单独的文本框中搜索名字和姓氏。但我想在一个搜索表单中输入例如 John Doe 并获取与该人相关的表格。 我已经有一个带有表格的部分视图,只有当我分别输入名字和姓氏时才会显示信息。

【问题讨论】:

  • 为什么不能使用contains i.e. c.FirstName.Contains(search)?恕我直言,这将完成这项工作。

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


【解决方案1】:

您可以在视图中使用SearchClass 类,该类还包含FirstNameLastName 属性,并将其包含在表单中。

@model SearchClass

@using(Html.BeginForm()) {
  @Html.LabelFor(m => m.FirstName)
  @Html.TextBoxFor(m => m.FirstName)

 @Html.LabelFor(m => m.LastName)
 @Html.TextBoxFor(m => m.LastName)
 <input type="submit" value = "search" />
}

然后

[HttpPost]
public ActionResult Index(SearchClass search) {
   IQueryable<Contact> model = _db.Contacts.AsQueryable();
   if (!string.IsNullOrWhiteSpace(search.FirstName))
       model = model.Where(m => m.FirstName.StartsWith(search.FirstName));

   if (!string.IsNullOrWhiteSpace(search.LastName))
       model = model.Where(m => m.LastName.StartsWith(search.LastName));

   var result = model
            .OrderBy(c => c.FirstName)
            .Take(5)
            //etc.

}

【讨论】:

  • 一个细节:var model 必须是 IQueryable&lt;Contact&gt;,因为 _db.ContactsDbSetmodel.Where(..)DbQuery。两者都实现了IQueryable,而var 将被强类型化为DbSet
【解决方案2】:

如果您使用的是 Linq-to-entities,您可以使用 String.Concat 来连接实体的字段。

var searchResult = DbContext.Users
                        .Where(u => String.Concat(u.FirstName, " ", u.LastName)
                        .Contains(searchTerm));

【讨论】:

    【解决方案3】:

    我认为您的 linq 查询有一些类似的变化。

    在我的项目中,我正在使用这种方式:

    var data1 = (from con in dbData.tblPresenters
                                 let FillName = con.PresenterFirstName + " " + con.PresenterLastName
                                 where FillName.ToLower().Trim().Contains(txtName.Text.Trim().ToLower()) 
                                 select new
                                 {                                    
                                     FirstName = con.PresenterFirstName,
                                     LastName = con.PresenterLastName,
    
                                 }).ToList();
    

    也许这会对你有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      相关资源
      最近更新 更多