为使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. C# ikvm 运行htmlunit Provider com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl not found

    在使用 ikvm 去运行 htmlunit 中的 webclient Getpage的时候  报错说com.sun.org.apache.xerces.internal.jaxp.DocumentBu ...

  2. spring和mybatis整合进行事务管理

    1.声明式实现事务管理 XML命名空间定义,定义用于事务支持的tx命名空间和AOP支持的aop命名空间: <beans xmlns="http://www.springframewor ...

  3. centos5.5 安装git

    查看centos版本 # cat /etc/redhat-release CentOS release 5.5 (Final) 安装git 下载: 如果有老版本的git: #git clone git ...

  4. HTML 总结-表单-表单属性

    HTML5 表单属性 HTML5 的新的表单属性 本章讲解涉及 <form> 和 <input> 元素的新属性. 新的 form 属性: autocomplete novali ...

  5. YII2 使用js

    1.在 /backend/assets/ 中新建一个文件 CollectionAsset.php <?php /** * @link http://www.yiiframework.com/ * ...

  6. sqm(sqlmapGUI) pcat修改版

    sqlmap是一款开源的注入工具,支持几乎所有的数据库,支持get/post/cookie注入,支持错误回显注入/盲注,还有其他多种注入方法. 支持代理,指纹识别技术判断数据库 .而sqm(sqlma ...

  7. [LeetCode]题解(python):017-Letter Combinations of a Phone Number

    题目来源: https://leetcode.com/problems/letter-combinations-of-a-phone-number/ 题意分析: 这道题是输入一段数字字符digits, ...

  8. [LeetCode]题解(python):008-String to Integer (atoi)

    题目来源: https://leetcode.com/problems/string-to-integer-atoi/ 题意分析: 这道题也是简单题,题目意思是要将字符串转化成int.比如‘123’转 ...

  9. myeclipse部署时An internal error occurred 错误的几种情况

    myecplise上将工程部署到应用下时,经常出现 An internal error occurred during: "Add Deployment". java.lang.N ...

  10. JAVA用JNI方法调用C代码实现HelloWorld

    一.首先是java运行环境的搭建,到官网下载java jdk安装即可(注意要修改环境变量).还可以顺便安装eclipse. 二.编写java代码,文件名HelloWorld.java public c ...