ASP.Net MVC开发基础学习笔记(7):数据查询页面
前言
前面铺垫了那么多,今天我们就用mvc5 + ef6 + bootstrap3来正式创建一个基本查询页面。
为什么从查询页面开始?嘿嘿,因为小弟的.net生涯就是从查询页面开始的,记得正式工作的第一个月就是各种模块的查询。先做查询有什么好处?首先查询只读数据,不写数据。对本身的数据安全不造成影响也不怕写入脏数据的麻烦。其次增删改查这四个操作里面,查询的难度应该是最小的,不用考虑事务流程等方面的问题。
本节最后将会生成如下页面:
创建model
关于model、数据库上下文、entity framework,本系列教程前面已经有介绍
在models文件夹下创建一个类,命名为worker.cs,这个类就是我们这里要用到的model。代码如下:
namespace slarkinc.models { public enum sex { male, female } public class worker { public int id { get; set; } public string lastname { get; set; } public string firstname { get; set; } public sex sex { get; set; } public double? rating { get; set; } } }
为了方便说明,加入行号,如果想要复制代码,请点击左上角的小图标就会出现不带行号的代码。在worker类的上面,第3行,创建了一个sex的枚举类型,保证sex只有male和female两种取值。9到13行中worker类用自动属性的方法定义了5个属性,其中rating属性前面有个问号表示这个属性是nullable,可以是null。
创建数据库上下文dbcontext
这里我们用code first方法创建数据库表。这个方法简单点说就是先创建model再根据model生成数据库表。
为了方便起见,这里用的数据库是visual studio自带的localdb。
数据库上下文,就是我们这里的数据访问层,根据model对数据库表进行不同的操作。因此我们首先在项目中创建一个数据访问层文件夹,命名为dal。然后,在dal文件夹中创建model对应的数据库访问上下文类,命名为companycontext。写入代码如下:
using system.data.entity; using slarkinc.models; using system.data.entity.modelconfiguration.conventions; namespace slarkinc.dal { public class companycontext : dbcontext { public companycontext() : base("companycontext") { } public dbset workers {get;set;} protected override void onmodelcreating(dbmodelbuilder modelbuilder) { modelbuilder.conventions.remove(); } } }
因为我们这里数据库访问要用entity framework, 所以第1行要引入system.data.entity。第7行,我们的数据库上下文继承ef中的dbcontext基类。第9行表示
companycontext 继承基类dbcontext的构造函数。第13行表示我们的model worker和 companycontext中的数据集workers对应。第15到18行定义了一个事件
onmodelcreating,这个事件在我们使用的code first方法在数据库中创建数据表时触发。第17行的代码的作用是使我们创建出来的数据库表名字都是单数,不是复数。也就是说将来的数据库表名是worker而不是workers。这也是我们创建数据库表的习惯命名方法。
然后在web.config文件里面加入这个数据库上下文要用到的数据库连接字符串。如下面的代码所示,在web.config文件中找到
这样我们的数据库上下文companycontext就可以用这个连接字符串来访问数据库了。解释一下
然后我们还要在web.config中声明数据库上下文。在
type="slarkinc.dal.companycontext, slarkinc"中的slarkinc.dal.companycontext表示这个companycontext的namespace和类名。逗号后面的slarkinc表示这个companycontext在slarkinc.dll中。
这样我们就把companycontext添加到了entity framework的上下文中。
创建初始化数据
为了方便测试,我们需要在数据库创建好之后给其中添加一些数据。因此我们来创建一个数据初始化类来做这个工作。在dal文件夹中创建一个类,命名为companyinitializer.cs。写入如下代码:
using system.collections.generic; using slarkinc.models; namespace slarkinc.dal { public class companyinitializer : system.data.entity.dropcreatedatabasealways { protected override void seed(companycontext context) { var students = new list { new worker{firstname="andy",lastname="george",sex = sex.male}, new worker{firstname="laura",lastname="smith",sex = sex.female}, new worker{firstname="jason",lastname="black",sex = sex.male}, new worker{firstname="linda",lastname="queen",sex = sex.female}, new worker{firstname="james",lastname="brown", sex = sex.male} }; students.foreach(s => context.workers.add(s)); context.savechanges(); } } }
第6行,我们的数据初始化类继承了一个名为dropcreatedatabasealways的泛型类,这个类的作用就像它的名字,每次程序运行时都会删除并重新创建数据库,这样方便我们测试。第8到20行,就是初始化数据的函数,重写了父类的seed函数,并接受companycontext 作为数据库上下文供我们操作。第18行用linq语法将 students的数据添加到数据库上下文的数据集中。第19行,将这些数据提交到数据库。
然后要在web.config文件中配置这个初始化器。在刚才配置过的
type="slarkinc.dal.companyinitializer, slarkinc"中的slarkinc.dal.companyinitializer表示这个companyinitializer的namespace和类名。逗号后面的slarkinc表示这个companyinitializer在slarkinc.dll中。
这样我们的初始化器就完成了。
创建controller
controller没学好的同学-5-get-started-controller.html" target="_blank">请猛戳我!
在controllers文件夹下创建一个controller选择"mvc 5 控制器 - 空",命名为companycontroller.cs。写入代码如下:
using system.linq; using system.web.mvc; using slarkinc.dal; namespace slarkinc.controllers { public class companycontroller : controller { private companycontext db = new companycontext(); public viewresult index() { return view(db.workers.tolist()); } } }
为了使用之前创建的model和数据库上下文,在第3行引入dal命名空间并在第9行初始化companycontext。在第12行创建index action返回类型是viewresult,那么用户请求就会返回一个view页面。然后在第12行把所有的数据传递给view。第12行tolist方法是把数据以list的形式输出。
创建view
要创建companycontroller的index action对应的view,首先在views文件夹下创建company文件夹。然后在company文件夹下创建一个空视图并选择使用布局页。命名为index.cshtml。写入如下代码:
@model ienumerable@html.displaynamefor(model => model.firstname)@html.displaynamefor(model => model.lastname)@html.displaynamefor(model => model.sex)@html.displaynamefor(model => model.rating)