Поиск по значению из выпадающего списка - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть проект, который действует как веб-книжный магазин. Я реализовал поиск, который в настоящее время только ищет книги по автору. Что я хотел бы сделать, это включить поиск по автору / названию / что-то еще.

У меня есть общее представление о том, как, по моему мнению, это может сработать, но мне не хватает некоторых частей, поэтому я прошу совета здесь.

Вот то, что я думаю, может быть хорошим подходом:

  • В представлении есть раскрывающийся селектор, в котором можно указать поиск по автору / названию книги

  • Это будет передано из представления в контроллер, и я смогу выполнить поиск по переданному значению (автор / booktitle).

Я хотел бы знать, как можно реализовать мой подход, а также обсудить разные идеи, которые могут также работать. Спасибо за ваше время.

Ниже приведен код в контроллере, который возвращает книги автора, которые я ищу, довольно просто.

 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 голосов
/ 06 сентября 2018

В случае, если кому-то интересно, вот код, который я использовал после того, как предложил @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);
    }
0 голосов
/ 06 сентября 2018

Я думаю, что написание небольшого поиска Func<> было бы хорошим способом выполнить поиск по нескольким свойствам в модели. Он может использовать Reflection, чтобы сделать его более общим, но мы постараемся сделать его простым.

Предполагается, что ваша Книга модель выглядит следующим образом

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...