asp.net脚手架是asp.net web应用程序的代码生成框架。 visual studio 2013包含用于mvc和web api项目的预安装代码生成器。当想快速添加与数据模型交互的代码时,可以将脚手架添加到项目中。使用脚手架可以减少在项目中开发标准数据操作的时间。
正如在前面章节教程中所看到的,我们已经为index,create,edit操作创建了视图,并且还需要更新操作方法。但asp.net mvc提供了一种使用脚手架创建所有这些视图和操作方法的更简单的方法。
我们来看一个简单的例子。它创建一个包含模型类 -employee的相同示例,但是这次将使用脚手架。
第1步 - 打开visual studio,然后单击:文件 -> 新建 -> 项目 菜单选项。一个新的项目对话框打开。
第2步 - 在左侧窗格中,选择:模板 -> visual c# -> web 。
第3步 - 在中间窗格中,选择“asp.net web应用程序”。
第4步 - 在名称字段中输入项目名称:mvcscaffolding ,然后单击确定 继续。
将看到下面的对话框,要求设置asp.net项目的初始内容。
第5步 - 为了简单起见,选择:空 选项,并在为以下项添加文件夹和核心引用’ 中选中mvc 复选框,然后单击确定。
它将使用最少的预定义内容创建一个基本的mvc项目。
项目由visual studio创建后,将在“解决方案资源管理器” 窗口中看到许多文件和文件夹。
第一步是安装实体框架(entity framework)。右键单击该项目,然后选择:管理nuget程序包 ,打开nuget软件包管理器 。它将打开“nuget包管理器”,在搜索框中搜索entity framework。如下所示 -
选择实体框架(entity framework),然后点击“安装(install)” 按钮。 它将打开预览对话框。
点击确定 继续下一步 -
点击“我接受”按钮开始安装,完成后如下 -
当实体框架安装成功后,可看到如上面的截图所示的出窗口的消息。
要添加模型,请右键单击解决方案资源管理器 中的models 文件夹,然后选择:添加 -> 类 ,会看到添加新项目 对话框。
在中间平移中选择:类,并在名称字段中输入:employee.cs。如下图所示 -
使用以下代码将一些属性添加到employee类。
using system; namespace mvcscaffolding.models { public class employee{ public int id { get; set; } public string name { get; set; } public datetime joiningdate { get; set; } public int age { get; set; } } }
经过上一步,我们已经创建了一个employee模型,现在需要在这个模型类上添加另一个类,它将与实体框架(entity framework)进行通信来检索和保存数据。 以下是employee.cs文件中的完整代码。
using system; using system.data.entity; namespace mvcscaffolding.models{ public class employee{ public int id { get; set; } public string name { get; set; } public datetime joiningdate { get; set; } public int age { get; set; } } public class empdbcontext : dbcontext{ public dbset<employee> employees { get; set; } } }
如上面所看到的empdbcontext是从一个名为dbcontext的ef类派生的。 在这个类中,有一个名为dbset的属性,它基本上代表了要查询和保存的实体。
要添加脚手架,请右键单击解决方案管理器中的controllers文件夹,然后选择:添加 -> 新建搭建基架项目 ,如下图所示 -
它将显示“添加脚手架”对话框 -
选择:包含视图mvc 5控制器(使用entity framework) 项,然后单击“添加” 按钮,这将显示添加控制器对话框。
从模型类 下拉列表中选择:employee,并从数据上下文类 下拉列表中选择empdbcontext。还将看到默认情况下选择了控制器名称。
单击“添加”按钮继续,在由visual studio使用脚手架创建的employeescontroller中看到以下代码。
using system; using system.collections.generic; using system.data; using system.data.entity; using system.linq; using system.net; using system.web; using system.web.mvc; using mvcscaffolding.models; namespace mvcscaffolding.controllers { public class employeescontroller : controller { private empdbcontext db = new empdbcontext(); // get: employees public actionresult index() { return view(db.employees.tolist()); } // get: employees/details/5 public actionresult details(int? id) { if (id == null) { return new httpstatuscoderesult(httpstatuscode.badrequest); } employee employee = db.employees.find(id); if (employee == null) { return httpnotfound(); } return view(employee); } // get: employees/create public actionresult create() { return view(); } // post: employees/create // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关 // 详细信息,请参阅 http://go.microsoft.com/fwlink/?linkid=317598。 [httppost] [validateantiforgerytoken] public actionresult create([bind(include = "id,name,joiningdate,age")] employee employee) { if (modelstate.isvalid) { db.employees.add(employee); db.savechanges(); return redirecttoaction("index"); } return view(employee); } // get: employees/edit/5 public actionresult edit(int? id) { if (id == null) { return new httpstatuscoderesult(httpstatuscode.badrequest); } employee employee = db.employees.find(id); if (employee == null) { return httpnotfound(); } return view(employee); } // post: employees/edit/5 // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关 // 详细信息,请参阅 http://go.microsoft.com/fwlink/?linkid=317598。 [httppost] [validateantiforgerytoken] public actionresult edit([bind(include = "id,name,joiningdate,age")] employee employee) { if (modelstate.isvalid) { db.entry(employee).state = entitystate.modified; db.savechanges(); return redirecttoaction("index"); } return view(employee); } // get: employees/delete/5 public actionresult delete(int? id) { if (id == null) { return new httpstatuscoderesult(httpstatuscode.badrequest); } employee employee = db.employees.find(id); if (employee == null) { return httpnotfound(); } return view(employee); } // post: employees/delete/5 [httppost, actionname("delete")] [validateantiforgerytoken] public actionresult deleteconfirmed(int id) { employee employee = db.employees.find(id); db.employees.remove(employee); db.savechanges(); return redirecttoaction("index"); } protected override void dispose(bool disposing) { if (disposing) { db.dispose(); } base.dispose(disposing); } } }
运行应用程序并使用浏览器打开url:http://localhost:59083/employees,将看到以下输出结果 -
可以看到视图中并没有数据,因为我们还没有向 visual studio 创建的数据库添加任何记录。
下面点击添加(create new)链接来一个记录,它将显示创建视图,填入相关信息 -
点击“创建”按钮,它将更新index 视图,看到有一条记录。如下所示-
也可以看到新记录也被添加到数据库中。
通过上面所看实现步骤可以看到,我们已经通过使用脚手架实现了一个简单的例子,这是一个用来创建模型类,视图和动作方法的更容易方式。