演练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,将注入当前视图的内容,以便让布局包围住前面所编写的专用于动作的视图所生成的标记。

posted @ 2014-09-11 11:09  liesl  阅读(715)  评论(2编辑  收藏  举报