基于.Net Core Web MVC的图书查询系统
- 第一章,.Net Core Web MVC配置身份验证和注册登录功能并修改默认页面
- 第二章,.Net Core Web MVC配置邮件发送服务
- 第三章,在.Net Core Web MVC中使用Sqlite数据库
- 第四章,添加模型并使用EF Core生成基架&自动生成控制器和视图
- 第五章,条件查询的设计与实现
第五章,条件查询的设计与实现
前言
一个网站的主要工作便是查询,从数据库中检索用户查询的内容并展示到页面上。在上一篇文章中以及介绍了使用EFCore工具来生成基架。
在这篇文章中,将介绍多条件查询功能的设计与实现。
这里以上一章中使用的图书类来举例
一、单条件查询
单条件查询功能微软已经给了我们足够全面清晰的教程可供参考,请移步将搜索添加到 ASP.NET Core MVC 应用
二、修改控制器Index方法
使用以下代码更新 Controllers/MoviesController.cs 中的 Index 方法:
//[HttpPost] //加这一行表示post方式提交,不加就是get方式
//async Task<IActionResult>表示异步获取,同步方式可以直接写IActionResult
public async Task<IActionResult> Index(Book MyBook)
{
var Books = _context.Book.Where(s =>
//先判断是否为空,因为多条件查询中有的条件可能为空,不能查询等于空的条件
(string.IsNullOrEmpty(MyBook.BookName) || s.BookName.Contains(MyBook.BookName)) &&
(string.IsNullOrEmpty(MyBook.Author) || s.Author.Contains(MyBook.Author)) &&
//由于这里的BookType是枚举类型,而枚举类型的变量一定不为空,所以这里需要将类声明中
//public bookType BookType { get; set; }改为public bookType? BookType { get; set; }
//这样该类型就可以是空值了。防止用户没有选择这个查询条件却传上来一个不为空的值
(MyBook.BookType == null || s.BookType == MyBook.BookType) &&
//DateTime类型不为空,如果用户没有选择,那么传上来的就是DateTime.MinValue
//这里也可以像上面的BookType一样前面加个?让它可为空
(MyBook.DateOfPublication == DateTime.MinValue || s.DateOfPublication == MyBook.DateOfPublication) &&
(string.IsNullOrEmpty(MyBook.Introduction) || s.Introduction.Contains(MyBook.Introduction)) &&
(string.IsNullOrEmpty(MyBook.Press) || s.Press.Contains(MyBook.Press))
);
//await Books.ToListAsync()是异步方式获取
//同步方式可以改成 View(Books.ToList());
return View(await Books.ToListAsync());
}
三、在视图中添加检索页面
将以下代码复制到Views/Home/Index.cshtml
@model 图书查询系统.Models.Book
@{
ViewData["Title"] = "Home Page";
}
<form asp-controller="Books" asp-action="Index" method="get">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="ID" />
<div class="form-group">
<label asp-for="BookName" class="control-label"></label>
<input asp-for="BookName" class="form-control" />
<span asp-validation-for="BookName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Author" class="control-label"></label>
<input asp-for="Author" class="form-control" />
<span asp-validation-for="Author" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="BookType" class="control-label"></label>
<select asp-for="BookType" class="form-control" asp-items="@Html.GetEnumSelectList(typeof(bookType))">
<option>请选择</option>
</select>
<span asp-validation-for="BookType" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="DateOfPublication" class="control-label"></label>
<input asp-for="DateOfPublication" class="form-control" />
<span asp-validation-for="DateOfPublication" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Press" class="control-label"></label>
<input asp-for="Press" class="form-control" />
<span asp-validation-for="Press" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Introduction" class="control-label"></label>
<input asp-for="Introduction" class="form-control" />
<span asp-validation-for="Introduction" class="text-danger"></span>
</div>
<input type="submit" value="检索" class="btn btn-primary BtnMargin" />
<input type="reset" value="重置" class="btn btn-primary BtnMargin" />
</form>
其中第一行“@model 图书查询系统.Models.Book” 是引用我们自定义的模型类
“@{}”是指执行C#代码,我们可以将页面变量的一些预处理放在此。
下面是一些html标签,这里面大量使用了asp-for标记帮助程序。它是将模型类中的属性与页面控件绑定,可以避免我们手动设置名称这些操作,减少出错。
例如:
<label asp-for="BookName" class="control-label"></label>
这是将模型类中BookName属性绑定到该标签。如果控件是label,那么这个label显示的就是属性的别名,也就是我们设置的
[RegularExpression(@"^[^\s]*$", ErrorMessage = "请输入汉字、字母或数字")]//通过正则表达式设置数据合法性的规则,如果验证不合法就提示后面的ErrorMessage
[StringLength(20, MinimumLength = 1, ErrorMessage = "{0} 长度必须在 {2} 到 {1} 之间.")]
[Display(Name = "书名")]//这个名称
public string BookName { get; set; }
如果绑定的标签是input,那么提交表单的时候input里的内容就是提交到控制器的内容。
四、在数据库中添加几个简单的样本用来测试
我这里就直接在通过基架生成的页面里添加了。
五、检索测试
总结
以上就是关于.Net Core Web MVC中多条件查询的内容了。如果您遇到了什么问题,可以留言在下方评论区,作者将尽力为您解答。如果您觉得这篇文章对您有帮助,还请不要吝啬您手里的赞。同样,如果您觉得这篇文章有误或有待修改,请您指正批评,联系作者修改,作者将感激不尽!