演练2-2:Guestbook示例应用程序
为使Guestbook应用程序有用,我们需要为用户提供一些提交数据的方式,将这些数据存储起来,以便稍后进行查看。为了达到这一目标,我们打算对应用程序添加一个数据库,将其作为该留言簿的后台存储库。
1. 创建数据库
绝大多数Web应用程序都需要某种数据仓库的支持,这可能是一个关系型数据库(如微软的SQL Server或MySQL),或一个文档数据库(如Raven DB、MongoDB、CouchDB),抑或是一个简单的XML文件。我们的应用程序将使用SQL Server Compact,这是微软最新添加到SQL Server家族的一个关系型数据库。
SQL Server Compact是一个轻量级的数据库,可用于Web和桌面应用程序。与完整版本的SQL Server不同,它不需要安装任何服务器软件来运行。这意味着它是bin可部署的,只需将相应的DLL文件添加到应用程序的bin文件夹,就可以使用SQL Server Compact数据库了。这种方法的最大好处是,你可以将SQL Server Compact数据库部署到任何运行.NET 4的虚拟主机上,而无须虚拟主机提供商安装任何东西。
首先,右击App_Data目录并选择“添加 | 新项”,在对话框中选择“SQL Server Compact Database”,数据库命名为Guestbook.sdf,点击“添加”按钮,如下图所示。

下一步将对数据库添加一个数据表。在“服务器资源管理器”中双击新建的Guestbook.sdf数据库,以打开它。右击“表”,选择“创建表”,设置表们那个为GuestbookEntries,用来存储留言信息,输入相关的列如下。


2. 添加模型
(1)右击“Models”文件夹,添加类,代码如下。

这个模型含有4个POCO对象,对应于数据表中的各个列。我们打算使用这个类的实例来表示存储在数据库中的数据。但是,如何将数据库中的数据转换成对象?我们可以根据SQL查询的结果,手工编写必要的代码来合成GuestbookEntry的实例。不过,依靠对象关系映射(Object-Relational Mapping,ORM)工具来做这件是要更简单些。
(2)添加GuestbookContext类
我们采用Entity Framework 4.1来做这种映射。首先需添加一个DbContext类,这个类提供了一个对Entity Framework的抽象,让我们能够进行数据持久化并接受数据。右击Models文件夹,添加GuestbookContext的类,代码如下。

这个类继承于DbContext基类(位于System.Data.Entity命名空间),首先声明了一个无参数的构造器,并使用构造器链将数据库名称传递给基类。在此例中,因为数据库叫做Guestbook.sdf,故将字符串“Guestbook”传递给基类的构造器。如果不这么做,EF会默认使用上下文类的全类型名作为该数据库的名称(即GuestbookModels.GuestbookContext.sdf)。
属性Entries,类型为DbSet<GuestbookEntry>,作为在GuestbookEntries表中查询数据的集合,就好像它是内存中的一个对象集合一样。在后台,EF将生成适当的SQL来查询该表,并将结果转换为强类型的GuestbookEntry对象。
(3)安装EntityFramework.SqlServerCompact包
最后,我们需要告诉EF,让它与SQL Server Compact数据库进行对话(默认情况下,EF会尝试连接到SQL Server Express的实例数据库,(local)\sqlexpress)。
右击“引用”,选择“管理NuGet包”,搜索“EntityFramework.SqlServerCompact”,并安装。一旦安装完毕,这个包便会自动地将相关代码添加到项目,以及使用SQL Server Compact数据库的EF进行配置。
3. 接受留言簿条目
右击Controllers文件夹,选择“添加 | 控制器”,弹出“添加控制器”对话框,点击“添加”按钮,如下图所示。

在控制器中添加一个叫作Create的新动作,如清单所示。
这个Create动作简单地返回了一个ViewResult,通过使用View方法指示框架应该渲染一个View/Guestbook子目录中名称为Create.cshtml的视图。运行后,出错。
右击Create动作,选择“添加视图”。
修改视图代码,如清单。
该视图包含了一个简单的HTML表单,让用户输入姓名和消息,并把它们回递给Create动作。Form元素的名称是Name和Message,它们与GuestbookEntry对象所定义的属性匹配。这是便于自动数据绑定所必需的。运行程序结果如下。
现在,我们需要创建一个控制器动作来处理这个表单的递交,并将数据插入数据库。首先对GuestbookController添加一个新的Create过载动作,如清单所示。
第2个Create重载动作用HttpPost注解属性进行修饰,这确保该动作版本只能作为对表单递交的响应进行调用(动作方法选择器,Action Method Selector)。它还接受一个GuestbookEntry类型的参数,其属性将自动用表单数据进行填充,因为表单字段名与这些属性名匹配,这一过程叫做模型绑定(Model Binding)。
4. 显示留言簿条目
为了显示留言条目,我们将对GuestbookController添加一个Index动作,它将利用 GuestbookContext来接收20条最新的条目,并将它们传递给视图。更新GuestbookController代码如下。


Indext动作首先定义了一个查询,以接受20条最新的条目,通过条目的添加日期顺序进行排序,然后取最前面20条。查询结果保存在ViewBag中,以便能够在视图中对它们进行访问。修改Create动作,以便一旦创建了一条新条目,便重定向到Index动作。这通过RedirectToAction方法来实现,指示框架应该执行一个HTTP302的重定向,将浏览器发送到一个不同的位置。
清单2.7所示的Index动作中的查询是使用语言集成查询(LINQ)语法进行定义的,EF的LINQ提供程序会将该查询转换成接收SQL Server Compact数据库数据所必需的相应SQL语句。
接下来添加Index视图,视图代码如下。

这个视图含有一个添加新条目的链接,以及通过循环遍历ViewBag中的每个条目,写出消息、作者姓名和消息日期。
5. 用布局定制外观
我们此刻所见到的的视图只包含了特定于单个页面的内容,所有外围元素(如菜单和标题)都是在一个布局中定义的。布局(Layout)可以用来提供由所有页面共享的公用用户界面元素,类似于ASP.NET Web Form的母版页Master Page。为了编辑应用程序的布局,可打开位于Views\Shared子目录中的_Layout.cshtml文件。


在顶部,该布局包含了CSS和脚本的导入。Site.css文件中含有用于应用程序的样式,而脚本元素包括了流行的jQuery库,我们可以将其用于添加页面的富客户端交互性。
为了修改应用程序标题,我们可以用自己的字符串代替<h1>元素的内容。
默认应用程序中的“登录”链接是通过分部视图(Partial View)渲染出来的,提供一种跨越多个页面重用部分HTML的方式。
该文件也包含了网站的导航,它被渲染成一个无序列表,这些列表项包含了指向各个动作的链接。我们使用了HTML辅助器ActionLink,而不是使用硬编码的链接。我们将修改链接如下, <li>@Html.ActionLink("给我们留言", "Index", "Guestbook")</li>,其中第一个参数是超链接的文本,第二个是要链接的动作名称,第三个是动作所在的控制器名称。
@RenderBody,将注入当前视图的内容,以便让布局包围住前面所编写的专用于动作的视图所生成的标记。
演练2-2:Guestbook示例应用程序的更多相关文章
- 03.WebView演练-iOS开发Demo(示例程序)源代码
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong //转载请注明出处--本文永久链接:h ...
- LR12.53—使用HP网络导游示例应用程序
本教程使用 的HP Web之旅,一个样本的基于Web的旅行社系统,向人们展示LoadRunner将如何作为负载测试解决方案.惠普网络旅游用户连接到Web服务器,搜索航班,预订机票,检查飞行路线. 虽然 ...
- OpenSSL密码算法库: MD5示例小程序
OpenSSL http://www.openssl.org/ OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL 的密码算法库包含多种加密算 ...
- Emoji.voto,Linkerd 服务网格(service mesh)的示例应用程序
一个微服务应用程序,允许用户为他们最喜欢的表情符号(emoji)投票,并跟踪排行榜上收到的投票.愿最好的 emoji 获胜. 该应用程序由以下 3 个服务组成: emojivoto-web:Web 前 ...
- 将 Android* x86 NDK 供 Eclipse* 而移植 NDK 演示示例应用程序
目标 面向 Eclipse (ADT) 的 Android 插件如今支持基于 NDK 的应用开发. 其可自己主动生成项目和构件文件以及代码存根.并可集成到整个 Android 应用开发中(构建原生库. ...
- 【构建之法教学项目】一个简单的基于C#的电子商务系统演练场景的代码示例
电子商务平台,是一个历史悠久而又充满挑战的行业,他和社交一起成为中国互联网市场的两极.电子商务系统是一个非常复杂的系统,他实现了人与物.人与人的链接,同时也需要大量的技术来支撑,实现系统的高可用.这些 ...
- Week1(9月12日):很激动的第一次课
Part I:课程介绍 =========================== 1. 学时 8*16=128 2. 时间 周二1234,周五1234 3. 地点 E307 4. 考试方式 笔试+上机 ...
- Week2(9月16日):动手做个简单的例子
Part I:提问 =========================== 1.什么是ASP.NET MVC? 2.MVC的英文? 3.什么是模型? 4.什么是控制器? 5.什么是视图? 6.ASP ...
- .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序
在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...
随机推荐
- 通知/代理/block 三者比对
通知 : “一对多”,”多对一” 传值 四个步骤: 1.发送通知2.创建监听者3.接收通知4.移除监听者 使用场景:1- 很多控制器都需要知道一个事件,应该用通知:2 - 相隔多层的两个控制器之 ...
- javaweb学习路之二--上传gitgub
代码上传github 代码上传到github的步骤 第一步:申请github账号 https://github.com/注册账号 第二步:登录github,新建repository仓库,命名,创建 第 ...
- 在mac本上折腾android 开发环境
众所周知的原因,google的很多网站在国内无法访问,苦逼了一堆天朝程序员,下是在mac本上折腾android 开发环境的过程: 一.先下载android sdk for mac 给二个靠谱的网址: ...
- Java基础之编程语法(一)
1.基本格式 所有Java代码都应该在一个class中. Java是严格区分大小写的. Java是一种自由格式的语言.Java代码分为结构定义语句和功能执行语句,功能执行语句最后必须以分号结束. 2. ...
- setTimeout和setInterval区别
setTimeout和setInterval这两个函数, 大家肯定都不陌生, 但可能并不是每个用过这两个方法的同学, 都了解其内部的实质 甚至可能会错误的把两个实现定时调用的函数理解成了类似threa ...
- ThinkPHP 3.1.2 模板的使用技巧
本节课大纲: 一.模板包含 <include file="完整模板文件名" /> <include file="./Tpl/default/Public ...
- PHP - 抓取电视剧资源
<?php /** * 获取下载url * @return [type] [description] */ function getVedioDwonloadUrl() { for ($i=1; ...
- MYSQL - 创建数据库时设置编码
CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE 的语法: CRE ...
- 判断圆和矩形是否相交C - Rectangle and Circle
Description Given a rectangle and a circle in the coordinate system(two edges of the rectangle are p ...
- Hibernate 笔记1
Hibernate表generator标签的作用,如下图,