【问题标题】:Turn click search into instant search using Partial View使用部分视图将点击搜索变为即时搜索
【发布时间】:2015-10-13 15:30:39
【问题描述】:

我有一个表单,点击按钮会根据给定的 searchString 返回搜索结果视图。

@using (Html.BeginForm("Index", "Search"))
{
    <div id="search" class="input-group">
        @Html.TextBox("searchString", null, new { @id = "searchBox", @class = "form-control", @placeholder = "Search" })
        <div class="input-group-btn">
            <button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button>
        </div>
    </div>
}

这会调用 Search 控制器上的 Index 操作,该操作根据 searchString 获取结果并填充强类型模型“SearchView”的列表

public ViewResult Index(string searchString = "", int startIndex = 0, int pageSize = 5)
{
    List<SearchView> searchResults = 
        (from p in db.Products
         where p.code.Contains(searchString)
         select new { ID = p.ID, Table = "Product", Name = p.code, Controller = "Product" })
             .ToList()
             .Select(x => new SearchView { ID = x.ID, Table = x.Table, Name = x.Name, Controller = x.Controller }).ToList();

    searchResults.AddRange(
        (from p in db.Multimedias
         where p.name.Contains(searchString)
         where p.isActive == true
         select new { ID = p.ID, Table = "Image", Name = p.name, Controller = "Multimedia" })
             .ToList()
             .Select(x => new SearchView { ID = x.ID, Table = x.Table, Name = x.Name, Controller = x.Controller }).ToList()); 

    ViewBag.startIndex = startIndex;
    ViewBag.pageSize = pageSize;
    ViewBag.loadMore = searchResults.Count > startIndex + pageSize;

    return View(searchResults.Skip(startIndex).Take(pageSize));
}

然后视图被调用,它只是一个结果列表

<table class="table">
@foreach (var item in Model) 
{
    <tr>
        <td>
            <b>@Html.DisplayFor(modelItem => item.Table)</b><br />
            @Html.ActionLink(item.Name, "Details", item.Controller, new { @ID = item.ID }, null)
        </td>
    </tr>
}
@if (ViewBag.LoadMore)
{ 
    <tr>
        <td>
            <b> @Html.ActionLink("See more results...", "Index", "Search", new { @startIndex = ViewBag.startIndex + ViewBag.pageSize }, null)</b>
        </td>
    </tr>
}
</table>

我的问题是,如何将视图转换为局部视图并更改表单,以便在文本框中的每次按键时显示局部视图?

编辑:接受的答案可以工作,但要求我返回部分视图并在 javascript 上使用 keyup 而不是 keypress 以及删除空格来创建有效的 URL。

return PartialView("_Search", searchResults.Skip(startIndex).Take(pageSize));

$("#searchBox").keyup(function () {      
    $("#myPartialViewContainer").load('@Url.Action("IndexLive","Search")' + '?searchString=' + $('#searchBox').val() + '&startIndex=0' + '&pageSize=5');
});

【问题讨论】:

  • 您将需要 javascript/jquery 和 ajax。 This question.answer 应该可以帮助您入门。它在单击按钮时进行“搜索”,但您可以轻松处理文本框 .keyup() 事件(但我认为一旦您尝试它,您可能会坚持使用按钮)

标签: javascript c# jquery asp.net-mvc


【解决方案1】:

使用 ajax 加载而不是表单提交来加载您的局部视图。

查看

  1. 创建局部视图容器来保存局部视图结果。

  2. 在 jquery 文本框按键事件中,只需调用局部视图并加载到局部视图容器中。

    @using (Html.BeginForm("Index", "Search"))
    {
         <div id="search" class="input-group">
           @Html.TextBox("searchString", null, new { @id = "searchBox", @class = "form-control", @placeholder = "Search" })
           <div class="input-group-btn">
            <button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button>
          </div>
          </div>
    
        <!--Hold partial view content-->
            <div id="myPartialViewContainer">        
            </div>
    
        <!--Include jquery-->
        <!--Scripts to help load partial view content in partial view container-->
            @section Scripts
             {
             $( document ).ready(function() {
                // On each key press this will execute
                $('#searchBox').keyup(function(e) { 
                // Following will load partial view in partial view container
                $("#myPartialViewContainer").load('@Url.Action("Search","Index")' + '?searchString =' + $('#searchBox').val()+ '&startIndex =0' + '&pageSize =5');
    
             });
             });
             }
     }
    

【讨论】:

  • .live()???它在 v1.7 中被贬值并在 v1.9 中被删除。 - 只需$('#searchBox').keyup(function() {
  • 感谢一些小调整,我得到了这个答案,搜索控制器还需要返回 PartialView 而不是 View,并且需要使用 keyup 而不是 keypress,因为它没有注册否则为最新字符。
猜你喜欢
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多