根据下拉菜单中的值进行搜索

时间:2018-09-04 22:13:03

标签: c# asp.net search razor

我有一个充当网络书店的项目。我已经实施了搜索,目前仅按作者搜索书籍。我想做的是按作者/标题/其他方式启用搜索。

我对自己的想法有一个大致的了解,但是我遗漏了一些内容,这就是为什么我在这里寻求建议的原因。

以下是我认为可能是一种不错的方法:

  • 视图中有一个下拉选择器,可以在其中指定按作者/书名进行搜索

  • 这将从视图传递到控制器,我将能够按传递的值(作者/书名)进行搜索。

我想知道如何实现我的方法,并进行讨论  不同的想法可能也会起作用。谢谢您的宝贵时间。

下面是控制器中的代码,它非常简单地按我搜索的作者返回书籍。

 public IActionResult Index(string searchString)
       {
        bool hasSearchResults = false;
        var model = _bookstoreData.GetAll();
        if (!string.IsNullOrEmpty(searchString))
        {
            model = model.Where(s => s.Author.Contains(searchString));
            hasSearchResults = true;
        }
        return hasSearchResults ? View("SearchResult", model) : View(model);
       }

这是匹配的视图:

<form asp-controller="Home" asp-action="Index">
            <div class="container searchBar">
                <div class="container searchBar">
                    <input type="text" name="searchString" class="form-control" placeholder="Search books by title, author...">
                    <input type="hidden" />
                </div>
            </div>
</form>

2 个答案:

答案 0 :(得分:0)

我认为写一点搜索Func<>是在模型中跨多个属性实现搜索的好方法。它可能使用Reflection使它更通用,但我们将尝试使其保持简单。

假设您的 Book 模型看起来像这样

public class Book
{
    public string Title { get; set; }
    public string Author { get; set; }
    public string ISBN { get; set; }
}

现在让我们创建一个简单的Regex

private bool IsMatch(string input, string pattern)
{
    return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase);
}

我们将在要创建的搜索Func<>中重用此功能,并使用它来过滤书籍。 Func<>基本上就像一个函数调用,可以具有输入和返回值。

让我们看看我们的搜索功能

Func<Book, bool> searchFunc = (book) =>
{
    string query = $"({q})";

    if (IsMatch(book.Title, query) || IsMatch(book.Author, query) || 
        IsMatch(book.ISBN, query)
        {
           return true;
        }
    return false;
};

让我们最终将它们放到我们的索引操作中

public IActionResult Index(string q)
{
    Func<Book, bool> searchFunc = (book) =>
    {
        string query = $"({q})";

        if (IsMatch(book.Title, query) || IsMatch(book.Author, query) || 
            IsMatch(book.ISBN, query))
        {
            return true;
        }
        return false;
    };
    var books = _bookstoreData.GetAll()
                              .Where(searchFunc)
                              .ToList();
    return books.Count > 0 ? View("SearchResult", books) : View(books);
}

希望这会有所帮助。

答案 1 :(得分:0)

万一有兴趣的人,这是我使用@machariadev建议的内容后得到的代码。

如果搜索字符串为空,则显示所有书籍,如果有搜索字符串,则显示具有适当结果的视图。

 public IActionResult Index(string searchString)
    {
        bool hasSearchResults = false;
        var model = _bookstoreData.GetAll();

        Func<Book, bool> searchFunc = (book) =>
        {
            string query = $"({searchString})";
            if (IsMatch(book.Title, query) || IsMatch(book.Author, query))
                return true;
            return false;
        };

        if (!string.IsNullOrEmpty(searchString))
        {
            model = model.Where(searchFunc).ToList();
            hasSearchResults = true;
        }

        return hasSearchResults ? View("SearchResult", model) : View(model);
    }