9.3.8 使用模型为视图传递信息
创建动态网站,需要从控制器的Action传送信息给视图模板。控制器的Action方法通过返回的ActionResult可以传送模型对象给视图。这就允许控制器可以将所有生成回应需要的数据打包,然后传送给视图模板,以便生成适当的HTML回应。
1)首先,创建一些模型类来表示商店中的唱片类型和专辑类型,从创建专辑类Genre开始,在项目中,右击模型Models文件夹,然后选择增加类选项,然后命名为Genre.cs。如图9-30、9-31所示。
图9-30 创建类
图9-31 创建唱片类Genre
在新创建的专辑类Genre中增加3个属性:专辑编号、专辑名称、专辑描述,代码如下:
用同样的方法创建唱片类Album,它有两个属性:Title和Genre,代码如下:
2)更新StoreController控制器的Details方法,使得返回ActionResult类型的结果而不是字符串。同时,修改方法的处理逻辑,返回一个专辑对象到视图中,代码如下:
注意:对于上述函数体第一句,表面上看,可能会认为使用var定义变量使用了迟绑定。实际上,C#编译器使用赋予变量的值来推定变量的类型,因此album变量的类型就是Album类型。
因为album类是在Models下定义的,所以系统会提示“未能找到类型”,这时可以右击“album”,选择“解析”,添加对Models类的引用,如图9-32所示。这样,系统会添加一条引用“using MvcMusicStore.Models;”在文件的开头。
图9-32 添加Models类的引用
下面创建一个使用专辑来生成HTML的模板,在这样做之前,需要编译项目,可以通过菜单“生成”的“生成解决方案”来完成。Details方法中右键选择“增加视图…”,像以前一样,看到创建视图的对话框,不一样的是,要选中“创建强类型视图”,然后在下面的列表中选择“Album”类,这样视图将会期望得到一个Album类型的对象,如图9-33所示。
图9-33 创建强类型视图
在单击增加之后,视图模板\Views\Store\Details.cshtml被创建了,其中包含的代码如下:
注意:上述代码第一行,表示视图使用强类型的Album类。Rozer视图引擎理解传送来的Album对象,所以可以容易地访问模型的属性。
更新<h2>标记,<h2>Album:@Model.Title</h2>,使得可以显示专辑的Title属性。再次运行并访问/Store/Details/5,可以得到图9-34所示的结果。
图9-34 Details视图
3)修改StoreController控制器下的Browse方法,更新方法返回ActionResult类型的结果,修改方法的处理,返回一个Genre类型的对象实例如下:
然后在方法上右击,增加一个强类型的视图,模型类为Genre。在生成的browse.cshtml文件中修改<h2>标记中的Genre显示信息为:<h2>Browsing Genre:@Model.Name</h2>。重新运行,访问/Store/Browse?Genre=Disco,可以看到如图9-35所示的效果。
图9-35 browse视图
4)修改storeController控制器中的Index方法。本项目使用Genre的一个列表显示所有唱片的类别,而不是单个的Genre对象。修改index方法代码如下:
然后对index方法创建一个基于Genre类的强类型视图。打开index.cshtml文件,修改代码如下:
注意:
第1行,@model IEnumerable<MvcMusicStore.Models.Genre>,这告诉视图引擎模式是一个包含多个Genre对象的集合,使用IEnumerable<Genre>而不是List<Genre>,因为这样更通用,可以允许在以后改变集合为任何实现IEnumerable接口的集合。
第9行,使用@foreach()函数遍历集合中的Genre对象。
第11行,使用Html.actionLink()方法实现地址链接。
ASP.NET MVC包含了一个HTML的助手类,其中的方法专门用于在视图模板中完成多种常见的任务,其中的Html.ActionLink()助手方法就是常用的一个,这使得可以容易地创建<a>,包括关于链接的一些细节处理,像地址需要进行URL编码之类。
Html.ActionLink()有多个重载用于多种情况,在简单的情况下,只需要提供提示的文本,以及指向的Action方法即可,比如希望链接到/Store的Index方法,提示文本为Go to the Store Index,那么下面的代码就可以实现。
@Html.ActionLink("Go to the Store Index","Index")
在本例中,使用另外一种重载方法来传递3个参数。①链接的提示文本,这里显示分类的名称。②控制器的名称,Browse。③路由参数,genre。
再次运行程序,访问/Store的时候,可以看到如图9-36所示的结果。出现一个唱片分类的列表,每一个分类都是一个超级链接,当单击链接的时候,将会被导航到/Store/Browse?genre=[genre]的地址。
图9-36 唱片浏览视图