为使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. openstack之网络基础

    L1:物理层L2:数据链路层,基于mac地址的通信,通过交换机连接:对等传输,即交换机上的一个主机发一个包,连接在该交换机上的所有机器都能收到:L3:网络层,基于ip地址,路由器设备,连接不同网段,进 ...

  2. 在C#中使用 Win32 和其他库

    C# 用户经常提出两个问题:“我为什么要另外编写代码来使用内置于 Windows® 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?”当框架小组构建他们的 .NET 部分时,他们评估了为使 ...

  3. json数据的获取(网络摘抄)

    一个简单的对象: $.ajax({ type: "post", url: "Handler.ashx", dataType: "html", ...

  4. IntelliJ IDEA 14 注册码生成器

    IntelliJ IDEA 14 注册码生成器 文件为Java代码 自己编译运行里面的程序输入名称然后就生成注册码了工具:http://yun.baidu.com/s/1cZKsA部分工具生成的注册码 ...

  5. 【转】Ubuntu常用软件合集

    [转]Ubuntu常用软件合集 Ubuntu常用软件合集 我用的使Ubuntu-Kylin14.04,原因呢主要是觉得使本土化的,自带了日历.输入法.优客助手等易于上手的应用.也省的每次安装完原生的系 ...

  6. ubuntu ~/.bash_history

    sudo apt-get update sudo apt-get install python-pip sudo pip install Django==1.7.1 sudo apt-get inst ...

  7. 深入浅出—JAVA(8)

    8.接口与抽象类 不是抽象的类就被称为具体类 不同继承树的类也可以实现相同的接口,类可以实现多个接口.

  8. android 破解九宫格

    将目录切换到D:/adb目录下,命令如下 敲入命令 adb shell 然后回车,可以见到如下结果 再敲入命令cd /data/system然后回车, 再执行 rm gesture.key 回车,搞定 ...

  9. Jenkins Maven打包出错异常的解决方法

    Jenkins是一个很好用的打包部署工具,实现一键式部署项目,在项目处于测试阶段或者对于运维人员来讲是非常方便的一个工具. 但是最近使用Jenkins部署项目时老是出错,主要是maven打包的问题,错 ...

  10. UVA 270 Lining Up 共线点 暴力

    题意:给出几个点的位置,问一条直线最多能连过几个点. 只要枚举每两个点组成的直线,然后找直线上的点数,更新最大值即可. 我这样做过于暴力,2.7s让人心惊肉跳...应该还能继续剪枝的,同一直线找过之后 ...