《ProASP.NETMVC5》、《锋利的jQuery》
此系列皆使用VS2017+C#作为开发环境。如果有什么问题或者意见欢迎在留言区进行留言。
本章内容:自定义布局页、自定义EditorFor模板、EF多对多数据的更新
一、更新模型
同时由于书籍和学生存在多对多的关系——一本书可被多人预约,而一个人可以借阅多本书,因此在此更新模型使书籍与学生有多对多的关系。
此处仅展示模型的修改,控制器方面的修改请在查看源码:
引入中间导航类:
这里新增的AppointingDateTime用于将借阅的书籍以及预约的书籍进行区分。
1publicclassAppointmentOrLending2{3publicBookBook{get;set;}4publicstringBookId{get;set;}5publicStudentInfoStudent{get;set;}6publicstringStudentId{get;set;}7publicDateTimeAppointingDateTime{get;set;}8}
Student模型改动
1publicclassStudent:IdentityUser2{3///
添加新模型StudentInfo:
1publicclassStudentInfo2{3[Key]4publicstringUserName{get;set;}56[Required]7publicstringName{get;set;}89///
在借书信息处添加学生信息和中间类的表,同时在此指定中间类的外键——指定其外键由学生学号和书籍条形码共同组成,需要重写DbContext父类的OnModelCreating方法使其覆盖对应表格在EF的默认生成方式:
1publicclassLendingInfoDbContext:DbContext2{3publicLendingInfoDbContext(DbContextOptions
然后例行的更新数据库:
cdlibrarydemoadd-migrationAddStudents-cLibraryDemo.Data.LendingInfoDbContextupdate-database-cLibraryDemo.Data.LendingInfoDbContext
在原BookInitiator中对Students表进行初始化:
1if(!context.Students.Any())2{3IEnumerable
二、自定义布局页
在ASP.NET中,默认将HTML页面的body元素一部分抽出来,该部分称作RenderBody;然后将这部分放到一个布局即大体页面框架中即可完成对同一系列的页面进行精简的布局实现。
默认布局页为_Layout.cshtml,可在视图文件夹中根目录或各个控制器视图目录的_ViewStart.cshtml修改默认布局页,或者在每个Razor页面的开头中指定布局页:
1@{2ViewData["Title"]="EditLendingInfo";3Layout="_LendingLayout";4}
之前一直使用的是VS的默认布局页,现在以该默认布局页为基础,添加自己所需要的信息:
现在大体框架:
除了默认的RenderBody外,可以指定特定的部分放在页面的不同地方,在布局页中使用@RenderSection("SectionName"):
1@RenderSection("SectionName")
且在视图页中使用指定特定的节@sectionSectionName{};
1@sectionSectionName{23};则该视图页中的SectionName部分会被提取出来放到布局页对应的位置。
三、管理员编辑借阅信息
动作方法:
在此对数据库的表格使用Include方法使EF应用其导航属性以获得KeepingBooks列表,否则使用Student对象KeepingBooks属性只会返回空。
将BookState枚举提取成分部视图_BookStatePartial:
1@usingLibraryDemo.Models.DomainModels2@modelBook3
Html.DisplayFor方法是ASP.NET内置对各种属性进行展示的方法,可以在项目的Views文件夹中的Shared文件夹创建对应类型的Editor模板供其使用:
在此创建一个DateTime.cshtml,于是我们使用Html.DisplayFor用于展示DateTime数据时只会显示年份/月份/天数:
1@modelDateTime23@Model.ToString("yyyy/M/dd")
视图中使用partialTagHelper指定其name为_BookStatePartial以应用分部视图:
结果:
四、查看个人信息
1[Authorize]2publicasyncTask
视图:
五、借阅书籍
由于暂时未有获取二维码的接口,仅通过直接访问Lending模拟借阅:
六、续借书籍
1[Authorize]2[HttpPost]3publicasyncTask
七、查询书籍
修改之前的Search方法使其通过当前用户的身份返回不同页面,以及在_LendingInfoLayout中添加搜索框部分:
1publicasyncTask