ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面
摘要
????? 本文首先一步一步完成Demo的第一個(gè)頁(yè)面——首頁(yè)。然后根據(jù)實(shí)現(xiàn)過(guò)程,說(shuō)明一下其中用到的與ASP.NET MVC相關(guān)的概念與原理。
讓第一個(gè)頁(yè)面跑起來(lái)
????? 現(xiàn)在,我們來(lái)實(shí)現(xiàn)公告系統(tǒng)中的第一個(gè)頁(yè)面——首頁(yè)。它非常簡(jiǎn)單,只包括所有公告分類的列表,并且每個(gè)列表項(xiàng)是一個(gè)超鏈接。其中分類數(shù)據(jù)是用我們的Mock組件得到的。實(shí)現(xiàn)后界面如下:
?
????? 在開(kāi)始之前,我們要?jiǎng)h幾個(gè)東西。因?yàn)槟J(rèn)情況下建立一個(gè)MVC項(xiàng)目時(shí)里面包含了幾個(gè)示例頁(yè)面,我們要做的就是:
????? 1.將Controllers文件夾下所有文件刪除。
????? 2.將Views文件夾下除了Shared文件夾和Web.config外的所有文件刪除,然后將Shared文件夾里面的文件刪除。
????? 完成以上幾步后,就可以開(kāi)始實(shí)現(xiàn)第一個(gè)頁(yè)面了。
實(shí)現(xiàn)控制器
????? 在Controllers文件夾下新建一個(gè)文件,類型選擇“MVC Controller Class”,名字命名為HomeController.cs。這就是一個(gè)控制器類。然后我們?yōu)樗幋a,具體代碼如下:
HomeController.cs:
?2using?System.Collections.Generic;
?3using?System.Linq;
?4using?System.Web;
?5using?System.Web.Mvc;
?6using?System.Web.Mvc.Ajax;
?7using?MVCDemo.Models;
?8using?MVCDemo.Models.Interfaces;
?9using?MVCDemo.Models.Entities;
10
11namespace?MVCDemo.Controllers
12{
13????public?class?HomeController?:?Controller
14????{
15????????public?ActionResult?Index()
16????????{
17????????????ICategoryService?cServ?=?ServiceBuilder.BuildCategoryService();
18????????????ViewData["Categories"]?=?cServ.GetAll();
19????????????return?View("Index");
20????????}
21????}
22}
????? 直觀看來(lái),這個(gè)類不是很復(fù)雜。它首先繼承了Controller類。Controller類是ASP.NET MVC框架中提供的一個(gè)控制器積累,所有我們自定義的控制器類都要繼承此基類。然后這個(gè)類中有一個(gè)Index方法,返回值類型是ActionResult。
????? 這里對(duì)其中涉及到的概念簡(jiǎn)單解釋一下。首先,控制器類可以說(shuō)是ASP.NET MVC的核心類,因?yàn)樗鼘⑻幚硪磺姓?qǐng)求,并處理所有頁(yè)面轉(zhuǎn)發(fā)等表示邏輯,這也是使用了ASP.NET MVC后與傳統(tǒng)ASP.NET應(yīng)用最大的差別。在傳統(tǒng)模式下,一個(gè)用戶請(qǐng)求的url將對(duì)應(yīng)一個(gè)aspx文件,而在ASP.NET MVC下,一個(gè)用戶請(qǐng)求對(duì)應(yīng)某個(gè)控制器類中的一個(gè)方法,而這個(gè)方法,就叫做一個(gè)Action。至于如何對(duì)應(yīng)的,則是通過(guò)對(duì)url的解析。
????? 例如,在傳統(tǒng)情況下,http://localhost/Default.aspx表示請(qǐng)求網(wǎng)站根目錄下的Default.aspx文件。而現(xiàn)在,url可能變成了這種樣子:http://localhost/Home/Index。這個(gè)意思就是,請(qǐng)求名叫HomeController控制器類下的Index方法。一般地,默認(rèn)情況下,請(qǐng)求url的格式為http://localhost/{ControllerName}/{ActionName}。其中{ControllerName}是控制器類名“Controller”前的部分,{ActionName}就是方法名。
????? 當(dāng)然,這種映射規(guī)則是可以更改的,而且請(qǐng)求Action時(shí)也可以傳遞參數(shù),但這些都是后話,以后再慢慢討論。
????? 下面再深入Index方法,看看這個(gè)Action都做了什么。它首先調(diào)用了業(yè)務(wù)邏輯組件(當(dāng)然,是Mock的),然后將GetAll返回的公告分類數(shù)據(jù)賦予ViewData["Category"],最后調(diào)用View()方法返回一個(gè)ActionResult。ViewData是什么呢?你可以把他理解成一個(gè)關(guān)聯(lián)數(shù)組,它保存需要傳給視圖的數(shù)據(jù)。而View是Controller類的一個(gè)方法,它返回一個(gè)ActionResult實(shí)例。這樣說(shuō)可能有點(diǎn)抽象,其實(shí)直觀就是將某個(gè)視圖(一般就是一個(gè)aspx文件)呈現(xiàn)到瀏覽器中。那么如何知道呈現(xiàn)哪一個(gè)視圖呢?默認(rèn)情況下,View方法會(huì)到網(wǎng)站的Views文件夾下的與控制器類同名的文件夾下尋找與Action方法同名的視圖。例如,HomeController的Index方法就會(huì)尋找Views/Home/Index.aspx,如果找不到,就會(huì)到Shared下尋找,再找不到就報(bào)錯(cuò)了。當(dāng)然,你也可以給View方法傳遞一個(gè)字符串參數(shù),表示視圖名稱。
實(shí)現(xiàn)視圖
????? 上文說(shuō)到,當(dāng)請(qǐng)求http://localhost/Home/Index時(shí),HomeController的Index方法會(huì)被調(diào)用,而Index方法最后要呈現(xiàn)Views/Home/Index.aspx視圖,所以,我們要在Views文件夾下建立一個(gè)Home文件夾,然后再新建一個(gè)Index.aspx視圖。如果您使用的是VS2008 SP1,那么建立視圖非常方便,只要在Home文件夾下右鍵單擊,選Add--->View,然后指定視圖名就可以了。如果不是SP1的,就新建一個(gè)Item,類型選擇“MVC View Page”。建立好的視圖其實(shí)就是一個(gè)aspx頁(yè)面,但是其繼承了View。這也是一個(gè)基類,所有視圖需要繼承它。
????? 下面給出Index.aspx的代碼:
Index.aspx:
?2<%@?Import?Namespace="MVCDemo.Models.Entities"?%>
?3
?4<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
?5
?6<html?xmlns="http://www.w3.org/1999/xhtml"?>
?7<head?runat="server">
?8????<title></title>
?9</head>
10<body>
11????<%?List<CategoryInfo>?categories=ViewData["Categories"]?as?List<CategoryInfo>;?%>
12????<div>
13????????<h1>MVC公告發(fā)布系統(tǒng)</h1>
14????????<ul>
15????????????<%?foreach?(CategoryInfo?c?in?categories)
16???????????????{
17????????????????????%>
18????????????<li><%=?Html.ActionLink(c.Name,?"List/"?+?c.ID,?"Announce")?%></li>
19????????????<%?}?%>
20????????</ul>
21????</div>
22</body>
23</html>
????? 大約分析一下。剛才說(shuō)過(guò),Index這個(gè)Action最后呈現(xiàn)這個(gè)aspx作為視圖,而且ViewData中包含了要給視圖傳遞的數(shù)據(jù)。在那里,我們將所有公告類別數(shù)據(jù)放在ViewData["Categories"]中。這里可以看到,我們將這些數(shù)據(jù)取出,并用來(lái)呈現(xiàn)頁(yè)面。至于那個(gè)Html.Action,這里先不細(xì)說(shuō)。你只要知道,這個(gè)方法可以生成一個(gè)鏈接,其中第一個(gè)參數(shù)是鏈接文字,第二個(gè)是要鏈接到的url的Action名,第三個(gè)是要鏈接到的url的控制器名。關(guān)于這些,我們以后細(xì)細(xì)討論。
????? 運(yùn)行這個(gè)例子,并將請(qǐng)求url定位到Home/Index,就可以看到運(yùn)行效果。
????? 你可能會(huì)發(fā)現(xiàn),不需要指定Home/Index,在輸入根目錄后就直接呈現(xiàn)了這個(gè)頁(yè)面。其實(shí)這是因?yàn)樵谀J(rèn)的路由配置里,Home和Index是默認(rèn)的控制器名和Action名。以后我們將會(huì)討論路由問(wèn)題。
小結(jié)
????? 通過(guò)上面的過(guò)程,我們第一個(gè)ASP.NET MVC頁(yè)面已經(jīng)能呈現(xiàn)出來(lái)了。而且不單純只是一個(gè)頁(yè)面,其中還呈現(xiàn)了業(yè)務(wù)邏輯組件返回的數(shù)據(jù)。
????? 也許,您對(duì)其中許多地方還有困惑。不要著急,在下一篇中,我們做這個(gè)系統(tǒng)的步伐先緩一緩,我將用一整篇文章,詳細(xì)介紹一下ASP.NET MVC中許多重要的概念與原理。
from:?http://www.cnblogs.com/leoo2sk/archive/2008/10/28/1321056.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ASP.NET MVC案例教程(基于AS
- 下一篇: OpenCV之core 模块. 核心功能