【问题标题】:Search based on value from a dropdown根据下拉列表中的值进行搜索
【发布时间】:2018-09-04 22:13:03
【问题描述】:

我有一个作为网络书店的项目。我已经实现了一个搜索,目前只按作者搜索书籍。我想做的是启用按作者/标题/其他内容进行搜索。

我对我认为这如何工作有一个大致的想法,但我遗漏了一些部分,这就是我在这里寻求建议的原因。

以下是我认为可能是个好方法:

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

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

我想知道如何实现我的方法,并讨论 不同的想法也可能奏效。感谢您的宝贵时间。

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

 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>

【问题讨论】:

  • 尝试使用 IF 语句并为作者和标题添加两个检查 model = model.Where(s =&gt; s.Title.Contains(searchString)); 您可以通过使用循环或 switch 语句很容易地检查一本书的许多不同内容。如果您将作者和标题都输入到同一个搜索框中,那么您需要使用一些智能逻辑并首先找到匹配作者的所有书籍(通过对搜索字段中的所有单词进行部分字符串匹配),然后再按标题匹配所有作者的书(也是部分字符串匹配)。

标签: c# asp.net search razor


【解决方案1】:

我认为编写一个小搜索 Func&lt;&gt; 将是实现跨模型中多个属性的搜索的好方法。它可以使用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&lt;&gt; 中重用这个函数,我们将创建并使用它来过滤书籍。 Func&lt;&gt; 基本上就像一个可以有输入和返回值的函数调用。

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

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);
}

希望这会有所帮助。

【讨论】:

  • 这正是我的想法,谢谢!在这种情况下,你会在哪里使用反射?
【解决方案2】:

如果有人感兴趣,这里是我在使用@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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多