为使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示例应用程序的更多相关文章

  1. 03.WebView演练-iOS开发Demo(示例程序)源代码

    技术博客http://www.cnblogs.com/ChenYilong/   新浪微博http://weibo.com/luohanchenyilong   //转载请注明出处--本文永久链接:h ...

  2. LR12.53—使用HP网络导游示例应用程序

    本教程使用 的HP Web之旅,一个样本的基于Web的旅行社系统,向人们展示LoadRunner将如何作为负载测试解决方案.惠普网络旅游用户连接到Web服务器,搜索航班,预订机票,检查飞行路线. 虽然 ...

  3. OpenSSL密码算法库: MD5示例小程序

    OpenSSL http://www.openssl.org/ OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL 的密码算法库包含多种加密算 ...

  4. Emoji.voto,Linkerd 服务网格(service mesh)的示例应用程序

    一个微服务应用程序,允许用户为他们最喜欢的表情符号(emoji)投票,并跟踪排行榜上收到的投票.愿最好的 emoji 获胜. 该应用程序由以下 3 个服务组成: emojivoto-web:Web 前 ...

  5. 将 Android* x86 NDK 供 Eclipse* 而移植 NDK 演示示例应用程序

    目标 面向 Eclipse (ADT) 的 Android 插件如今支持基于 NDK 的应用开发. 其可自己主动生成项目和构件文件以及代码存根.并可集成到整个 Android 应用开发中(构建原生库. ...

  6. 【构建之法教学项目】一个简单的基于C#的电子商务系统演练场景的代码示例

    电子商务平台,是一个历史悠久而又充满挑战的行业,他和社交一起成为中国互联网市场的两极.电子商务系统是一个非常复杂的系统,他实现了人与物.人与人的链接,同时也需要大量的技术来支撑,实现系统的高可用.这些 ...

  7. Week1(9月12日):很激动的第一次课

    Part I:课程介绍  =========================== 1. 学时 8*16=128 2. 时间 周二1234,周五1234 3. 地点 E307 4. 考试方式 笔试+上机 ...

  8. Week2(9月16日):动手做个简单的例子

    Part I:提问  =========================== 1.什么是ASP.NET MVC? 2.MVC的英文? 3.什么是模型? 4.什么是控制器? 5.什么是视图? 6.ASP ...

  9. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

随机推荐

  1. Cocos2d-x 3.0 使用TinyXml 解析XML文件

    在cocos2d-x 3.0中Xml解析已经不用自己找库了,已经为我们集成好了. text.xml <!--?xml version ="1.0" encoding =&qu ...

  2. JavaScript 高级程序设计(第3版)笔记——chapter6:面向对象的程序设计

    一.创建对象 工厂模式.使用简单的函数创建对象,为对象添加属性和方法,然后返回对象.[问题:没有解决对象识别问题] 1 function createPerson(name, age) { 2 var ...

  3. SQL Server(SSIS package) call .net DLL

    There are two method to call .net DLL in SQLSERVER. The first one is to use the sql clr but it has a ...

  4. Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)下

    前面说了一些在OpenCV在VS2013下的配置的过程,下面说一下其中的个别的知识点,了解一下这样配置的一点点更细节的过程.其实配置项目属性的时候,有两种方式: 一.通过项目属性管理器配置项目属性表 ...

  5. RPC框架——简单高效hessian的使用方式

    RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成“cl ...

  6. django 开发简易博客(二)

    这一节我们来了解模板和视图.URL的使用. 一.使用模板 在blog目录中新建templates文件夹,在templates文件夹下新建base.html文件.目录结构如下 templates/ ba ...

  7. java web中jsp连接mysql数据库 以及数据库连接池的使用

    将mysql-connector-java-5.1.6-bin.jar导入到tomcat的lib目录下. 在java项目中,只需要引入mysql-connector-java-5.1.6-bin.ja ...

  8. Regex阅读笔记(五)java操作篇

    首先一个demo程序 Java的正则表达式包为java.util.regex,主要是使用其中的Pattern和Matcher. groupCount方法时候都可调用,而大多数方法都必须在匹配尝试成功之 ...

  9. 自定义类StyleSheet跨浏览器操作样式表中的规则

    这是群里网友地瓜提供的一个类,不熟悉样式表对象和样式规则对象的浏览器差异的可以看看 /** * Stylesheet.js: utility methods for scripting CSS sty ...

  10. Outlook Anywhere 每次要输入密码

    客户端加入域Exchange OutlookAnywhere使用NTLM验证 2007 2010: