摘要
?????
本文首先一步一步完成
Demo
的第一個頁面
——
首頁。然后根據(jù)實現(xiàn)過程,說明一下其中用到的與
ASP.NET MVC
相關(guān)的概念與原理。
讓第一個頁面跑起來
?????
現(xiàn)在,我們來實現(xiàn)公告系統(tǒng)中的第一個頁面
——
首頁。它非常簡單,只包括所有公告分類的列表,并且每個列表項是一個超鏈接。其中分類數(shù)據(jù)是用我們的
Mock
組件得到的。實現(xiàn)后界面如下:
?
?????
在開始之前,我們要刪幾個東西。因為默認情況下建立一個
MVC
項目時里面包含了幾個示例頁面,我們要做的就是:
????? 1.
將
Controllers
文件夾下所有文件刪除。
????? 2.
將
Views
文件夾下除了
Shared
文件夾和
Web.config
外的所有文件刪除,然后將
Shared
文件夾里面的文件刪除。
?????
完成以上幾步后,就可以開始實現(xiàn)第一個頁面了。
實現(xiàn)控制器
?????
在
Controllers
文件夾下新建一個文件,類型選擇“
MVC Controller Class
”,名字命名為
HomeController.cs
。這就是一個控制器類。然后我們?yōu)樗幋a,具體代碼如下:
HomeController.cs:
?
- using ?System; ??
- using ?System.Collections.Generic; ??
- using ?System.Linq; ??
- using ?System.Web; ??
- using ?System.Web.Mvc; ??
- using ?System.Web.Mvc.Ajax; ??
- using ?MVCDemo.Models; ??
- using ?MVCDemo.Models.Interfaces; ??
- using ?MVCDemo.Models.Entities; ??
- ??
- namespace ?MVCDemo.Controllers ??
- { ??
- ???? public ? class ?HomeController?:?Controller ??
- ????{ ??
- ???????? public ?ActionResult?Index() ??
- ????????{ ??
- ????????????ICategoryService?cServ?=?ServiceBuilder.BuildCategoryService(); ??
- ????????????ViewData[ "Categories" ]?=?cServ.GetAll(); ??
- ???????????? return ?View( "Index" ); ??
- ????????} ??
- ????} ??
- }??
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; using MVCDemo.Models; using MVCDemo.Models.Interfaces; using MVCDemo.Models.Entities; namespace MVCDemo.Controllers { public class HomeController : Controller { public ActionResult Index() { ICategoryService cServ = ServiceBuilder.BuildCategoryService(); ViewData["Categories"] = cServ.GetAll(); return View("Index"); } } }
?
?
?????
直觀看來,這個類不是很復雜。它首先繼承了
Controller
類。
Controller
類是
ASP.NET MVC
框架中提供的一個控制器積累,所有我們自定義的控制器類都要繼承此基類。然后這個類中有一個
Index
方法,返回值類型是
ActionResult
。
?????
這里對其中涉及到的概念簡單解釋一下。首先,控制器類可以說是
ASP.NET MVC
的核心類,因為它將處理一切請求,并處理所有頁面轉(zhuǎn)發(fā)等表示邏輯,這也是使用了
ASP.NET MVC
后與傳統(tǒng)
ASP.NET
應用最大的差別。在傳統(tǒng)模式下,一個用戶請求的
url
將對應一個
aspx
文件,而在
ASP.NET MVC
下,一個用戶請求對應某個控制器類中的一個方法,而這個方法,就叫做一個
Action
。至于如何對應的,則是通過對
url
的解析。
?????
例如,在傳統(tǒng)情況下,
http://www.my400800.cn/index.aspx
表示請求網(wǎng)站根目錄下的
Default.aspx
文件。而現(xiàn)在,
url
可能變成了這種樣子:
http://blog.my400800.cn/北京400電話申請/1
。這個意思就是,請求名叫
HomeController
控制器類下的
Index
方法。一般地,默認情況下,請求
url
的格式為
http://localhost/{ControllerName}/{ActionName
}
。其中
{ControllerName}
是控制器類名“
Controller
”前的部分,
{ActionName}
就是方法名。
?????
當然,這種映射規(guī)則是可以更改的,而且請求
Action
時也可以傳遞參數(shù),但這些都是后話,以后再慢慢討論。
?????
下面再深入
Index
方法,看看這個
Action
都做了什么。它首先調(diào)用了業(yè)務邏輯組件(當然,是
Mock
的),然后將
GetAll
返回的公告分類數(shù)據(jù)賦予
ViewData["Category"]
,最后調(diào)用
View()
方法返回一個
ActionResult
。
ViewData
是什么呢?你可以把他理解成一個關(guān)聯(lián)數(shù)組,它保存需要傳給視圖的數(shù)據(jù)。而
View
是
Controller
類的一個方法,它返回一個
ActionResult
實例。這樣說可能有點抽象,其實直觀就是將某個視圖(一般就是一個
aspx
文件)呈現(xiàn)到瀏覽器中。那么如何知道呈現(xiàn)哪一個視圖呢?默認情況下,
View
方法會到網(wǎng)站的
Views
文件夾下的與控制器類同名的文件夾下尋找與
Action
方法同名的視圖。例如,
HomeController
的
Index
方法就會尋找
Views/Home/Index.aspx
,如果找不到,就會到
Shared
下尋找,再找不到就報錯了。當然,你也可以給
View
方法傳遞一個字符串參數(shù),表示視圖名稱。
實現(xiàn)視圖
?????
上文說到,當請求
http://localhost/Home/Index
時,
HomeController
的
Index
方法會被調(diào)用,而
Index
方法最后要呈現(xiàn)
Views/Home/Index.aspx
視圖,所以,我們要在
Views
文件夾下建立一個
Home
文件夾,然后再新建一個
Index.aspx
視圖。如果您使用的是
VS2008 SP1
,那么建立視圖非常方便,只要在
Home
文件夾下右鍵單擊,選
Add--->View
,然后指定視圖名就可以了。如果不是
SP1
的,就新建一個
Item
,類型選擇“
MVC View Page
”。建立好的視圖其實就是一個
aspx
頁面,但是其繼承了
View
。這也是一個基類,所有視圖需要繼承它。
?????
下面給出
Index.aspx
的代碼:
Index.aspx:
?
- <%@?Page?Language= "C#" ?AutoEventWireup= "true" ?CodeBehind= "Index.aspx.cs" ?Inherits= "MVCDemo.Views.Home.Index" ?%> ??
- <%@?Import?Namespace= "MVCDemo.Models.Entities" ?%> ??
- ??
- <!DOCTYPE?html?PUBLIC? "-//W3C//DTD?XHTML?1.0?Transitional//EN" ? "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > ??
- ??
- <html?xmlns= "http://www.w3.org/1999/xhtml" ?> ??
- <head?runat= "server" > ??
- ????<title></title> ??
- </head> ??
- <body> ??
- ????<%?List<CategoryInfo>?categories=ViewData[ "Categories" ]? as ?List<CategoryInfo>;?%> ??
- ????<div> ??
- ????????<h1><A?href= "http://www.my400800.cn" >400電話</A> ??
- MVC公告發(fā)布系統(tǒng)</h1> ??
- ????????<ul> ??
- ????????????<%? foreach ?(CategoryInfo?c? in ?categories) ??
- ???????????????{ ??
- ????????????????????%> ??
- ????????????<li><%=?Html.ActionLink(c.Name,? "List/" ?+?c.ID,? "Announce" )?%></li> ??
- ????????????<%?}?%> ??
- ????????</ul> ??
- ????</div> ??
- </body> ??
- </html>??
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MVCDemo.Views.Home.Index" %> <%@ Import Namespace="MVCDemo.Models.Entities" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> </head> <body> <% List<CategoryInfo> categories=ViewData["Categories"] as List<CategoryInfo>; %> <div> <h1> 400電話 MVC公告發(fā)布系統(tǒng)</h1> <ul> <% foreach (CategoryInfo c in categories) { %> <li><%= Html.ActionLink(c.Name, "List/" + c.ID, "Announce") %></li> <% } %> </ul> </div> </body> </html>
?
?
?????
大約分析一下。剛才說過,
Index
這個
Action
最后呈現(xiàn)這個
aspx
作為視圖,而且
ViewData
中包含了要給視圖傳遞的數(shù)據(jù)。在那里,我們將所有公告類別數(shù)據(jù)放在
ViewData["Categories"]
中。這里可以看到,我們將這些數(shù)據(jù)取出,并用來呈現(xiàn)頁面。至于那個
Html.Action
,這里先不細說。你只要知道,這個方法可以生成一個鏈接,其中第一個參數(shù)是鏈接文字,第二個是要鏈接到的
url
的
Action
名,第三個是要鏈接到的
url
的控制器名。關(guān)于這些,我們以后細細討論。
?????
運行這個例子,并將請求
url
定位到
Home/Index
,就可以看到運行效果。
?????
你可能會發(fā)現(xiàn),不需要指定
Home/Index
,在輸入根目錄后就直接呈現(xiàn)了這個頁面。其實這是因為在默認的路由配置里,
Home
和
Index
是默認的控制器名和
Action
名。以后我們將會討論路由問題。
小結(jié)
?????
通過上面的過程,我們第一個
ASP.NET MVC
頁面已經(jīng)能呈現(xiàn)出來了。而且不單純只是一個頁面,其中還呈現(xiàn)了業(yè)務邏輯組件返回的數(shù)據(jù)。
?????
也許,您對其中許多地方還有困惑。不要著急,在下一篇中,我們做這個系統(tǒng)的步伐先
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
