您的位置:首页 > 编程语言 > ASP

[翻译:ASP.NET MVC 教程]用ASP.NET MVC 创建一个电影数据库应用程序

2009-07-14 00:07 369 查看
本教程的目的是为你建立起怎样构建ASP.NETMVC应用程序的理念。在本教程中,我从始至终快速构建起一个完整的ASP.NETMVC应用程序。我向你展示了怎样构建一个简单的数据库驱动的并且实现以列表方式显示、创建以及编辑数据库记录的应用程序。

如果你已经有了ActiveServerPages或ASP.NET的工作经历,那么你也会很快熟悉ASP.NETMVC。ASP.NETMVC的视图与在一个ActiveServerPages应用程序中的页面极其相似。同时,就像一个传统的ASP.NETWebForms应用程序那样,ASP.NETMVC为你提供了一切经由.NETframework提供的丰富的语言集和类库的访问方式。

我希望本教程将给你一个构建ASP.NETMVC应用程序既简单又有别于构建ActiveServerPages或ASP.NETWebForms应用程序经历的理念。

电影数据库应用程序概览
因为我们的目标是使事情变得简单,我们将会构建一个非常简单的电影数据库应用程序。我们简单的电影数据库应用程序将允许我们做3件事:

1.以列表方式显示电影数据库记录集

2.创建一个电影数据库的新记录

3.编辑一个已存在的电影数据库记录

再一次的,我们的目标是使事情变得简单,我们将利用最小数量的ASP.NETMVC框架的特性来构建我们的应用程序。例如,我们将不使用测试驱动的(Test-Driven)开发模式。

为了创建我们的应用程序,我们需要完成以下的每一个步骤:

1.创建ASP.NETMVCWeb应用程序项目。

2.创建数据库

3.创建数据库模型

4.创建ASP.NETMVC控制器

5.创建ASP.NETMVC视图

准备工作
你需要VisualStudio2008或VisualWebDeveloper2008Express来构建一个ASP.NETMVC应用程序。你同时也需要下载ASP.NETMVCframework。

如果你没有自己的VisualStudio2008,你可以从以下站点下载VisualStudio2008的90天试用版:

http://msdn.microsoft.com/en-us/vs2008/products/cc268305.aspx

可替代地,你可以使用VisualWebDeveloper2008Express来创建ASP.NETMVC应用程序。如果你决定使用VisualWebDeveloper2008Express来创建,那么你必须安装好ServicePack1。你可以从以下站点下载VisualWebDeveloper2008ExpresswithServicePack1:

http://www.microsoft.com/downloads/details.aspx?FamilyId=BDB6391C-05CA-4036-9154-6DF4F6DEBD14&displaylang=en

在你完成VisualStudio2008或VisualWebDeveloper2008的安装后,你需要安装ASP.NETMVCframework。你可以从以下站点下载ASP.NETMVCframework:

http://www.asp.net/mvc/

创建一个ASP.NETMVCWeb应用程序项目
让我们在VisualStudio2008环境下开始创建一个新的ASP.NETMVCWeb应用程序项目。选择菜单File,NewProject,你将见到图1中的新建项目对话框。选择C#作为编程语言并且选择ASP.NETMVCWeb应用程序模版。将你的项目命名为MovieApp,点击OK按钮。





图1:新建项目对话框





无论何时,当你要创建一个新的MVCWeb应用程序项目,VisualStudio会提示你创建一个单独的单元测试项目。在图2中显示了该对话框。因为我们出于开发时间限制就不在本教程中创建单元测试了(的确,我们对此有点内疚)。选择No选项,点击OK按钮。









图2:创建单元测试项目对话框

一个ASP.NETMVC应用程序有一套标准文件夹:Models,Views和Controller文件夹。你能在解决方案浏览器窗口中看见这套标准文件夹。为了构建我们的电影数据库应用程序,我们需要在Models,Views和Controller文件夹中添加相应的文件。

当你用VisualStudio创建了一个新的MVC应用程序时,你会得到一个简易的应用程序。因为我们想要从头做起,我们需要从这简易的应用程序中删除一些内容。你需要删除下列文件及文件夹:

Controllers\HomeController.cs
Views\Home

创建数据库
我们需要创建一个数据库用来容纳我们的电影数据库的记录。幸运的是,VisualStudio包含了一个免费的数据库软件SQLServerExpress。按以下步骤创建数据库:

1.在解决方案浏览器中右击App_Data文件夹,然后选择菜单选项Add,NewItem

2.选择Data分类,然后选择SQLServerDatabase模板(见图3)。

3.将你的新数据库命名为MoviesDB.mdf,然后点击Add按钮。

在你创建数据库后,你能连接该数据库通过双击在App_Data文件夹中的MoviesDB.mdf文件。双击MoviesDB.mdf文件打开服务器浏览窗口。









图3:创建一个MicrosoftSQLServer数据库

下一步,我们需要创一个数据表。在服务器浏览窗口中,右击Tables文件夹并且选择菜单选项AddNewTable。选择该菜单选项打开数据表设计器。创建以下数据字段:
字段名称

数据类型

允许为空

Id

Int

False

Title

Nvarchar(100)

False

Director

Nvarchar(100)

False

DateReleased

DateTime

False

第一字段,即Id字段,有两个特殊属性。首先,你需要将Id字段设定为主键。选择Id字段后,点击SetPrimaryKey按钮(该按钮图标看上去像把钥匙)。其次,你需要将Id字段设定为可识别字段(Identitycolumn)。在字段属性窗口中,滚动至IdentitySpecification部分并且展开它。将IsIdentity属性值设定为Yes。当你完成操作后,数据表看上去应像图4那样。





图4:电影数据库的数据表

最后一步为保存新建立的数据表。点击Save按钮(软盘状的图标)并且将该表命名为Movies。

在你完成建表后,向表内添加一些电影记录。右击服务器浏览窗口中的Movies表并且选择菜单选项ShowTableData。键入一系列你最爱的电影记录。(见图5)。





图5:键入电影记录

创建数据模型
我们下一步需要创建一系列的类来代表我们的数据库。我们需要创建一个数据库模型。我们将利用MicrosoftEntityFramework来自动为我们的数据库生成类。





按照下列步骤进入实体数据模型(EntityDataModel)向导:

1.在服务器浏览窗口中右击Models文件夹,然后选择菜单选项Add,NewItem

2.选择Data分类,然后选择ADO.NETEntityDataModel模板。

3.将该数据模型命名为MoviesDBModel.edmx,然后点击Add按钮。

在你点击Add按钮后,实体数据模型向导(见图6)出现了。按照下列步骤完成向导:

1.在ChooseModelContents这步中,选择Generatefromdatabase选项。

2.在ChooseYourDataConnection这步中,使用MoviesDB.mdf数据连接,然后为该连接设定命名为MoviesDBEntities。点击Next按钮。

3.在ChooseYourDatabaseObjects这步中,展开Tables节点,选择Movies表。键入命名空间Models,然后点击Finish按钮。





图6:使用实体对象模型向导(EntityDataModelWizard)生成一个数据库模型

在你完成EntityDataModelWizard后,EntityDataModel设计器打开了。该设计器显示了Movies的数据表(见图7)。





图7:实体数据模型设计器

在我们继续下一步前,我们需要做一处改动。实体数据向导生成了一个命名为Movies的模型类来代表Movies数据表。因为我们将要用Movies类来代表一个特别的电影,我们需要修改类名,将Movies修改为Movie(是单数形式而不是复数形式)。

双击位于设计器表面的类名并且将该类名从Movies改为Movie。修改后,点击Save按钮(软盘状的图标)来生成Movie类。

创建ASP.NETMVC控制器
下一步将要创建ASP.NETMVC控制器。控制器代表了用户与ASP.NETMVC应用程序交互的控制。

按照下列步骤:

1.在解决方案浏览窗口中,右击Controllers文件夹,然后选择菜单选项Add,Controller

2.在AddController对话框中,键入名称HomeController并且勾选复选框AddactionmethodsforCreate,Update,andDetailsscenarios(见图8)

3.点击Add按钮,为你的项目添加新的控制器。

完成上述步骤后,在清单1中的控制器就创建好了。注意该控制器包含了名为Index,Details,Create,和Edit的方法。在接下来的段落中,我们将添加必要的程序代码是这些方法正常工作。





图8:添加一个新的ASP.NETMVC控制器

清单1——Controllers\HomeController.cs

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.Mvc;
usingSystem.Web.Mvc.Ajax;
namespaceMovieApp.Controllers
{
publicclassHomeController:Controller
{
//
//GET:/Home/
publicActionResultIndex()
{
returnView();
}
//
//GET:/Home/Details/5
publicActionResultDetails(intid)
{
returnView();
}
//
//GET:/Home/Create
publicActionResultCreate()
{
returnView();
}
//
//POST:/Home/Create
[AcceptVerbs(HttpVerbs.Post)]
publicActionResultCreate(FormCollectioncollection)
{
try
{
//TODO:Addinsertlogichere
returnRedirectToAction("Index");
}
catch
{
returnView();
}
}
//
//GET:/Home/Edit/5
publicActionResultEdit(intid)
{
returnView();
}
//
//POST:/Home/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
publicActionResultEdit(intid,FormCollectioncollection)
{
try
{
//TODO:Addupdatelogichere
returnRedirectToAction("Index");
}
catch
{
returnView();
}
}
}
}

以列表方式显示数据库记录
对于一个ASP.NETMVC应用程序来说,在HomeController中的Index()方法是默认方法。当你运行这个ASP.NETMVC应用程序时,Index()方法将会作为第一控制器方法而被调用。

我们将会使用Index()方法以列表方式显示Movies数据库表中的记录。我们将利用之前创建好的数据库模型类,使用Index()方法来检索Movies数据库表中的记录。

我修改了HomeController类并且显示在清单2中,目的是包含一个命名为_db的新建私有域。MoviesDBEntities类代表了我们的数据库模型并且我们将用这个类与我们的数据库进行交互通讯。

我也修改了Index()方法并且显示在清单2中。Index()方法使用MoviesDBEntities类从Movies数据库表中检索所有的电影记录。表达式_db.MovieSet.ToList()将Movies数据库表中所有的电影记录以列表的方式返回。

这样电影列表就传送到视图了。任何被传送至View()方法的内容将作为视图数据被传送至视图。

清单2——Controllers/HomeController.cs(修改后的Index方法)

usingSystem.Linq;
usingSystem.Web.Mvc;
usingMovieApp.Models;
namespaceMovieApp.Controllers
{
publicclassHomeController:Controller
{
privateMoviesDBEntities_db=newMoviesDBEntities();
publicActionResultIndex()
{
returnView(_db.MovieSet.ToList());
}
}
}

Index()方法返回一个命名为Index的视图。我们需要创建该视图用以列表方式显示电影数据库记录。按下列步骤操作:





1.在代码编辑器中,右击Index()方法,然后选择菜单选项AddView(见图9)。

2.在AddView对话框中,验证Createastrongly-typedview复选框已被勾选。

3.从下拉列表Viewcontent中,选择值List。

4.从下拉列表Viewdataclass中,选择值MovieApp.Models.Movie。

5.点击Add按钮完成新视图的创建(见图10)。

在你完成上述步骤后,一个新的命名为Index.aspx的视图就被添加至Views\Home文件夹下。Index视图的内容包含在清单3中。





图9:从控制器功能中添加一个视图





图10:用AddView对话框创建一个新视图

清单3——Views\Home\Index.aspx

<%@PageTitle=""Language="C#"MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<IEnumerable<MovieApp.Models.Movie>>"%>
<asp:ContentID="Content1"ContentPlaceHolderID="head"runat="server">
<title>Index</title>
</asp:Content>
<asp:ContentID="Content2"ContentPlaceHolderID="MainContent"runat="server">
<h2>Index</h2>
<table>
<tr>
<th></th>
<th>
Id
</th>
<th>
Title
</th>
<th>
Director
</th>
<th>
DateReleased
</th>
</tr>
<%foreach(variteminModel){%>
<tr>
<td>
<%=Html.ActionLink("Edit","Edit",new{/*id=item.PrimaryKey*/})%>|
<%=Html.ActionLink("Details","Details",new{/*id=item.PrimaryKey*/})%>
</td>
<td>
<%=Html.Encode(item.Id)%>
</td>
<td>
<%=Html.Encode(item.Title)%>
</td>
<td>
<%=Html.Encode(item.Director)%>
</td>
<td>
<%=Html.Encode(item.DateReleased)%>
</td>
</tr>
<%}%>
</table>
<p>
<%=Html.ActionLink("CreateNew","Create")%>
</p>
</asp:Content>

Index视图用HTML表格的方式显示了Movies数据库表中的所有的电影记录。该视图使用foreach循环迭代代表ViewData.Model属性的每一个电影。如果你按F5键来运行你的应用程序,你将会见到如图11所示的网页。





图11:Index视图

创建新数据库记录
我们在上一部分创建的Index视图包含一个创建新数据库记录的链接。让我们行动起来实现这个业务逻辑并且为创建新数据库记录而创建一个必要的视图。

HomeController包含了两个名为Create()的方法。第一个Create()方法没有参数。这个重载的Create()方法被用来为创建新数据库记录而显示一个HTML表单。

第二个Create()方法有一个FormCollection参数。这个重载的Create()方法在一个新建电影记录的HTML表单被发送至服务器时被调用。注意这第二个Create()方法有一个AcceptVerbs属性用来防止该方法被调用,除非当一次HTTPPost操作发生时。

修改后的第二个Create()方法在更新后的HomeController类中并且显示在清单4中。这个新版的Create()方法接受一个Movie参数并且包含了将新电影记录插入至Movies数据库表的业务逻辑。





清单4——Controllers\HomeController.cs(修改后的Create方法)

publicActionResultCreate()
{
returnView();
}
[AcceptVerbs(HttpVerbs.Post)]
publicActionResultCreate([Bind(Exclude="Id")]MoviemovieToCreate)
{
if(!ModelState.IsValid)
returnView();
try
{
_db.AddToMovieSet(movieToCreate);
_db.SaveChanges();
returnRedirectToAction("Index");
}
catch
{
returnView();
}
}

VisualStudio使创建新电影数据库记录的表单创建变得容易(见图12)。按下列步骤操作:

1.在代码编辑器中右击Create()方法,然后选择菜单选项AddView

2.验证Createastrongly-typedview复选框已被勾选。

3.从下拉列表Viewcontent中,选择值Create。

4.从下拉列表Viewdataclass中,选择值MovieApp.Models.Movie.。

5.点击Add按钮完成新视图的创建。





图12:添加Create视图

VisualStudio启动生成了如清单5所示的视图。该视图包含了一个能与Movies类中的每一个属性相匹配的表单域的HTML表单。

清单5——Views\Home\Create.aspx

<%@PageTitle=""Language="C#"MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<MovieApp.Models.Movie>"%>
<asp:ContentID="Content1"ContentPlaceHolderID="head"runat="server">
<title>Create</title>
</asp:Content>
<asp:ContentID="Content2"ContentPlaceHolderID="MainContent"runat="server">
<h2>Create</h2>
<%=Html.ValidationSummary()%>
<%using(Html.BeginForm()){%>
<fieldset>
<legend>Fields</legend>
<p>
<labelfor="Id">Id:</label>
<%=Html.TextBox("Id")%>
<%=Html.ValidationMessage("Id","*")%>
</p>
<p>
<labelfor="Title">Title:</label>
<%=Html.TextBox("Title")%>
<%=Html.ValidationMessage("Title","*")%>
</p>
<p>
<labelfor="Director">Director:</label>
<%=Html.TextBox("Director")%>
<%=Html.ValidationMessage("Director","*")%>
</p>
<p>
<labelfor="DateReleased">DateReleased:</label>
<%=Html.TextBox("DateReleased")%>
<%=Html.ValidationMessage("DateReleased","*")%>
</p>
<p>
<inputtype="submit"value="Create"/>
</p>
</fieldset>
<%}%>
<div>
<%=Html.ActionLink("BacktoList","Index")%>
</div>
</asp:Content>





在你添加Create视图后,你就可以向数据库中添加新的电影记录了。按F5键运行你的应用程序,然后点击CreateNew链接就可见到如图13所示的页面。如果你完成并且提交表单,一个新的电影数据库记录就被创建了。

注意到你已经自动地完成了表单验证。如果你忽略键入一个电影的上映日期,抑或是你键入一个无效的上映日期,表单将重新显示并且高亮显示上映日期域。





图13:创建一个新电影数据库记录

编辑已存在的数据库记录
在前一部分,我们讨论了怎样以列表方式显示数据库记录及创建新数据库记录。在这最后一部分,我们讨论怎样编辑已存在的数据库记录。

首先,我们需要修改Index视图。Index视图在每一条电影记录的左侧呈现了一个Edit链接。我们需要修改这个链接,目的是使正确的主键能传送至Edit视图。

在Index视图中找到下列代码行:

/*id=item.PrimaryKey*/})%>|

用实际主键属性来替代注释/*id=item.PrimaryKey*/,因此修改后的代码行应如下面那样:

{id=item.Id})%>|

下一步,我们需要生成Edit表单。这一步完成很简单因为VisualStudio会为我们自动生成Edit表单。在VisualStudio代码编辑器中打开HomeController.cs类,然后按下列步骤操作:

1.在代码编辑器中右击Edit()方法,然后选择菜单选项AddView(见图14)。

2.勾选Createastrongly-typedview复选框。

3.从下拉列表Viewcontent中,选择值Edit。

4.从下拉列表Viewdataclass中,选择值MovieApp.Models.Movie.。

5.点击Add按钮完成新视图的创建。

完成上述步骤后一个名为Edit.aspx的新视图就被添加至Views\Home文件夹中。该视图包含了用于编辑电影记录的HTML表单。





图14:添加Edit视图





最后,我们需要修改Homecontroller用以支持编辑数据库记录。更新后的Homecontroller类包含在清单6中。

清单6——Controllers\HomeController.cs(Edit方法)

publicActionResultEdit(intid)
{
varmovieToEdit=(frommin_db.MovieSet
wherem.Id==id
selectm).First();
returnView(movieToEdit);
}
[AcceptVerbs(HttpVerbs.Post)]
publicActionResultEdit(MoviemovieToEdit)
{
if(!ModelState.IsValid)
returnView();
try
{
varoriginalMovie=(frommin_db.MovieSet
wherem.Id==movieToEdit.Id
selectm).First();
_db.ApplyPropertyChanges(originalMovie.EntityKey.EntitySetName,movieToEdit);
_db.SaveChanges();
returnRedirectToAction("Index");
}
catch
{
returnView();
}
}

在清单6中,我已为两个重载的Edit()方法添加了附加的业务逻辑。第一个Edit()方法返回与传送至该方法的Id参数相匹配的电影数据库记录。第二个重载的Edit()方法实施了更新数据库记录。

注意你必须检索原始电影记录,然后调用ApplyPropertyChanges()方法来更新数据库中已存在的电影记录。

小结
本教程的目的是为你建立起构建一个ASP.NETMVC应用程序开发过程的理念。我希望你能够发现构建ASP.NETMVCWeb应用程序与构建ActiveServerPages或ASP.NET应用程序的经历是相似的。

在本教程中,我们仅仅测试了ASP.NETMVCframework的最为基础的特性。在接下来的教程中,我们将深入探讨诸如控制器、控制器功能、视图、视图数据以及HTML辅助等话题。

作者:Kinglee
文章出处:Kinglee’sBlog(http://www.cnblogs.com/Kinglee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐