基于.Net Core Web MVC的图书查询系统——第五章,条件查询的设计与实现

基于.Net Core Web MVC的图书查询系统



前言

一个网站的主要工作便是查询,从数据库中检索用户查询的内容并展示到页面上。在上一篇文章中以及介绍了使用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中多条件查询的内容了。如果您遇到了什么问题,可以留言在下方评论区,作者将尽力为您解答。如果您觉得这篇文章对您有帮助,还请不要吝啬您手里的赞。同样,如果您觉得这篇文章有误或有待修改,请您指正批评,联系作者修改,作者将感激不尽!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jumul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值