如何修改此搜索功能,以便我接受多个搜索字符串

问题描述 投票:0回答:1

我需要这个代码的帮助

模型:

public class SearchList
{
    public string Name { get; set; }
    public string className { get; set; }
}

控制器:

   [Authorize]
    public IActionResult Search(string sortOrder, string currentFilter, string name, int? page, string className)
    {
        ViewData["CurrentSort"] = sortOrder;
        ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
        ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";

        var searchList = FetchList()

        if (name != null)
        {
            page = 1;
        }
        else
        {
            name = currentFilter;
        }
        ViewData["CurrentFilter"] = name;

        if (!String.IsNullOrEmpty(name))
        {
            searchList = searchList.Where(m => m.Name.Contains(name)).ToList();

        }

        switch (sortOrder)
        {
            case "name_desc":
                searchList = searchList.OrderByDescending(s => s.Name).ToList();
                break;
            default:
                break;
        }

        int pageSize = 3;
        return View(PaginatedList<SearchList>.Create(searchList, page ?? 1, pageSize));

    }

    public IList<SearchList> FetchList()
    {
        var searchList = new List<SearchList>();

            searchList.Add(new SearchList
            {             
                Name = "Andy",
                className = "Class Alpha",

            });

            searchList.Add(new SearchList
            {             
                Name = "Nando",
                className = "Class Beta",

            });

            searchList.Add(new SearchList
            {             
                Name = "Anrya",
                className = "Class Alpha",

            });

        return searchList;
    }

我的看法

 <form asp-action="Search">
                <div>
                    <table id="t1" class="table table-bordered table-condensed">                            <tr>
                            <th>
                                <b>Details</b>
                            </th>
                        </tr>
                        <tr>
                            <td >
                                Name
                            </td>
                            <td>
           <input class="form-control" type="text" name="name" value="@ViewData["currentFilter"]" />

                   </td>
                        </tr>
                        <tr>
                            <td>
                                Class Name
                            </td>
                            <td>
                                <input class="form-control" style="width: 200px" type="text" name="classname">
                            </td>
                        </tr>
                    </table>
                    <div class="form-group">
                                <input type="submit" value="Search" class="btn btn-default"/>
                    </div>
                </div>
            </form>
        }
    </div>
</div>


         <form>
            <div>
                <table>
                    <tr>
                        <td colspan="6" class="tableheader">
                            Listing</b>
                        </td>
                    </tr>
                    <tr style="font-weight: bold; background:#efefef">
                        <td>
                            @Html.ActionLink("Name", "Search", new { sortOrder = ViewBag.NameSortParm })
                        </td>
                        <td>
                            Class Name
                        </td>
                    </tr>
                    @{
                        foreach (var m in Model.AsEnumerable())
                        {
                            <tr class="oddeventable">
                                <td>
                                    @Html.ActionLink(@m.Name, "TestStudent", "Student", new { Name = m.Name })
                                </td>
                                <td>
                                    @m.ClassName
                                </td>
                            </tr>
                        }
                    }
                </table>
            </div>
        </form>

@{
    var prevDisabled = !Model.HasPreviousPage ? "disabled" : "";
    var nextDisabled = !Model.HasNextPage ? "disabled" : "";
}

    <a asp-action="Search"
       asp-route-sortOrder="@ViewData["CurrentSort"]"
       asp-route-page="@(Model.PageIndex - 1)"
       asp-route-currentFilter="@ViewData["CurrentFilter"]"
       class="btn btn-default @prevDisabled">
        Previous
    </a>
    <a asp-action="Search"
       asp-route-sortOrder="@ViewData["CurrentSort"]"
       asp-route-page="@(Model.PageIndex + 1)"
       asp-route-currentFilter="@ViewData["CurrentFilter"]"
       class="btn btn-default @nextDisabled">
        Next
    </a>

当前视图和控制器只能接收一个搜索字符串“Name”,我想要做的是它也可以搜索className,所以基本上控制器将检索名称和className并过滤它并创建新的searchList和回到视图。我实际上很丢失,因为'currentFilter'本身就是'name'所以我不知道如何调整过滤器可以接受两个搜索字符串,所以稍后在View中我可以点击“Next”页面或者排序currentFilter。

c# search asp.net-core pagination asp.net-core-mvc
1个回答
1
投票

看起来您已经将className作为参数接受了。我会删除currentFilter参数并添加/更改您的过滤:

    if (name != null)
    {
        page = 1;
    }
    else
    {
        name = (string)ViewData["CurrentFilterName"];
    }
    ViewData["CurrentFilterName"] = name;

    if (!String.IsNullOrEmpty(name))
        searchList = searchList.Where(m => m.Name.Contains(name)).ToList();

    if (className == null)
        className = (string)ViewData["CurrentFilterClassName"];
    ViewData["CurrentFilterClassName"] = className;

    if (!String.IsNullOrEmpty(className))
        searchList = searchList.Where(m => m.className.Contains(className)).ToList();

同时更改输入,以便通过正确的ViewData项默认值。请注意,您当前没有在className上设置值。

并从你的下一个/上一个删除:

asp-route-currentFilter="@ViewData["CurrentFilter"]"

但是,您可以改为将方法更改为接受currentFilterName和currentFilterClassName,但是当您正在访问ViewData时,似乎没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.