3.1 MVC簡介
MVC(Model-View-Controller,模型—視圖—控制器模式)用於表示一種軟件架構模式。它把軟件系統分為三個基本部分:模型(Model),視圖(View)和控制器(Controller)。Asp.net MVC是微軟提供的MVC開發框架。
MVC將UI層分為了三個部分:
- 模型:一組類,描述了要處理的數據以及修改和操作數據的業務規則。
- 視圖:定義應用程序界面的顯示方式。
- 控制類:一組類,用於處理來自用戶、整個應用程序流以及特定應用程序邏輯的通信。
3.2 第一個Asp.net MVC 應用程序
3.2.1 創建ASP.NET MVC 應用
用VS創建了一個新的ASP.NET MVC應用程序后,將自動向這個項目中添加一些文件和目錄,如圖所示3-1所示。
圖3-1 asp.net mvc 項目目錄結構
表3-1是對目錄的說明
表3-1 asp.net mvc程序結構說明
目錄 |
用途 |
/Controller |
用於保存那些處理URL請求的Controller的派生類 |
/Models |
用於保存那些表示和操縱數據以及業務對象的類 |
/Views |
存那些負責呈現輸出結果(如HTML)的UI模板文件 |
/Scripts |
保存Js庫文件和腳本 |
/fonts |
用於保存Bootstrap模板系統中的字體文件 |
Content |
用於保存CSS、圖像和其他站點的內容,而非腳本 |
/App_Data |
保存想要讀取/寫入的數據文件比如.mdf的本地數據庫文件 |
/App_Start |
保存一些同能的配置代碼,路由等 |
3.2.2 ASP.NET MVC 工作原理
MVC模式的工作過程如圖3-2所示。
圖3-2 MVC工作過程
客戶端的所請求的URL是被映射到相應的Controller去,然后由Controller來處理業務邏輯,或許要從Model中取數據,然后再由Controller選擇合適的View返回給客戶端。
我們運行的ASP.NET MVC程序訪問的http://localhost:2176/Home/Index這個URL,它訪問的其實是HomeController中的Index這個Action,如圖3-3所示。
圖3-3 URL對應關系
其中 public ActionResult Index() 這個方法稱為Controller的Action,他返回的是ActionResult的類型。一個Controller可以有很多個Action。
那么一個URL是怎樣被定位到Controller中來的呢?它是通過"路由"完成的,默認代碼如下:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } |
RegisterRoutes()方法的作用就是定義路由,即定義URL訪問規則。我們可以看到這里定義了一個名為"Default"的Route,還定義了默認的參數。默認參數的意義在於,當我們訪問例如http://localhost:2176/的URL的時候,他會將不存在的參數用默認的參數補上,也就是相當於訪問http://localhost:2176/Home/Index一樣。
在控制器中,使用View()方法調用視圖,返回和動作方法同名的視圖,但是卻沒有顯示提供視圖的位置。其實這里依賴的是視圖的尋址規則,即會按照規則從規定的路徑去尋找這個命名的視圖。在ASP.NET MVC中,有一條尋址規則,就是從Views文件夾下和控制器名同名的文件夾中尋找。
ASP.NET MVC程序對於一次請求的處理過程如圖3-4所示。最開始應用程序啟動,注冊路由;當請求到來時,尋找路由表找到負責處理的控制器和動作方法,交給該動作方法處理;動作方法處理完畢,根據尋址規則找到視圖,由視圖負責頁面呈現。
圖3-4 ASP.NET MVC 工作過程
ASP.NET MVC框架的一大特點就是"約定勝於配置",即一些規則是約定好的,不需要通過配置文件去配置。我們約定:
- 所有的控制器都以Controller結尾。
- 應用程序中所有視圖都有一個統一的Views主目錄。
- 在Views主目錄下放置和控制器同名的子目錄。
3.3 ASP.NET 系統對象
對象名稱 |
說明 |
Request |
用來獲取客戶端在web請求期間發送的值,如URL參數、表單值等 |
Response |
用來負責返回到客戶端的HTTP輸出 |
Application |
作用於整個應用程序運行期間的狀態對象,可用來保存整個應用程序的配置參數 |
Session |
會話狀態保持對象 |
Cookie |
客戶端保持會話信息的方式 |
Server |
用於進行一些服務器端處理的工具對象,如URL,編碼解碼 |
HttpContext |
封裝有關個別HTTP請求的所有HTTP特定信息 |
3.3.1 Request對象
Request對象的常用成員如下:
成員 |
說明 |
String ContextType |
獲取設置傳入請求的MIME內容類型 |
HttpCookieCollection Cookies |
獲取客戶端發送的Cookie的集合 |
HttpFileCollection Files |
獲取由客戶端上傳的文件集合 |
NameValueCollection Form |
獲取表單提交的數據 |
NameValueCollection Headers |
獲取Http頭信息 |
NameValueCollection QueryString |
獲取Http查詢字符串變量集合 |
String RawUrl |
獲取當前請求的原始URL |
NameValueCollection ServerVariables |
獲取web服務器變量集合 |
String UserAgent |
獲取客戶端瀏覽器的原始用戶代理信息 |
String UserHostAddress |
獲取遠程客戶端的IP地址 |
String MapPath(path) |
將指定的虛擬路徑映射到物理路徑 |
Save() |
將HTTP請求保存到磁盤 |
3.3.2 Response對象常用成員
成員 |
說明 |
String ContentType |
獲取或設置輸出流的HTTP MIME類型 |
HttpCookieCollection Cookies |
獲取相應Cookie的集合 |
NameValueCollection Headers |
獲取相應標頭的集合 |
Redirect(url) |
將請求重定向到新的URL |
Write(data) |
將一個字符串寫入HTTP相應輸出流 |
3.3.3 Server對象常用成員
常用成員 |
說明 |
string MapPath(path) |
返回與Web服務器上的指定虛擬路徑相對應的物理文件路徑 |
Transfer |
使用指定的path路徑進行轉發 |
string UrlDecode |
對字符串進行URL編碼 |
string UrlEncode |
對字符串進行URL解碼 |
3.3.4 Session對象
在Asp.net 中,Session以key-value的方式在服務器端保存數據,它的使用方式非常簡單,如下。
Session["Session名稱"] = 值; //存值
變量 = Session["Session名稱"]; //取值
Session對象常用成員:
常用成員 |
說明 |
string SessionId |
包含唯一用戶會話標識符,它可用與整個會話過程記錄用戶的信息 |
int Timeout |
用戶超時的時間,單位分鍾。在該段時間內,用戶即使沒有任何操作用戶的狀態也不會清除。如果一段時間內沒有操作,服務器無法知道用戶是否在線,所以Session中的數據生存期以超時時間為限 |
Abandon() |
結束Session,取消當前會話 |
Add(name,value) |
添加Session數據 |
Remove(name) |
刪除數據 |
3.3.5 Cookie對象
語法:
Response.Cookies[Cookie的名稱].Value = 變量值; //寫入Cookie
string 變量 = Request.Cookies[Cookie的名稱].Value; //讀取Cookie
常用成員 |
說明 |
string Name |
Cookie對象名稱 |
string Value |
Cookie對象的內容 |
DataTime Expires |
Cookie對象的有效時間。如果沒有設置Cookie的失效日期,它們僅保存到關閉瀏覽器程序為止;如果Cookie對象的Expires屬性設置為DateTime.MaxValue,則表示Cookie永遠不會過期 |
3.3.6 HttpContext對象
常用成員 |
說明 |
HttpApplicationState Application |
Application對象 |
HttpRequest Request |
Request對象 |
HttpResponse |
Response對象 |
HttpServerUtility Server |
Server對象 |
HttpSessionState |
Session對象 |
Iprincipal User |
User對象 |
Cache |
Cache對象 |
static HttpContext Current |
為當前Http請求獲取或設置HttpContext對象 |
3.4 案例:實現用戶登錄
需求:
- 記住密碼功能
- 登錄用戶信息傳遞
3.4.1 跨域請求Session丟失問題解決方式
在登錄控制器中引用命名空間
using System.Web.SessionState;
控制器實現 IRequiresSessionState 接口
public class AccountController : Controller, IRequiresSessionState
{
public ActionResult Login(string loginName,string loginPwd)
{
if (loginName=="admin" && loginPwd=="sa")
{
Session["User"] = "admin"; //可直接使用
return RedirectToAction("index", "book");
}
}
}