我有一个充当网络书店的项目。我已经实施了搜索,目前仅按作者搜索书籍。我想做的是按作者/标题/其他方式启用搜索。
我对自己的想法有一个大致的了解,但是我遗漏了一些内容,这就是为什么我在这里寻求建议的原因。
以下是我认为可能是一种不错的方法:
视图中有一个下拉选择器,可以在其中指定按作者/书名进行搜索
这将从视图传递到控制器,我将能够按传递的值(作者/书名)进行搜索。
我想知道如何实现我的方法,并进行讨论 不同的想法可能也会起作用。谢谢您的宝贵时间。
下面是控制器中的代码,它非常简单地按我搜索的作者返回书籍。
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>
答案 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);
}