MVC(Model-View-Controller,模型—視圖—控制器模式)用於表示一種軟件架構模式。它把軟件系統分爲三個基本部分:模型(Model),視圖(View)和控制器(Controller)。Asp.net MVC是微軟提供的MVC開發框架。web
MVC將UI層分爲了三個部分: 數據庫
用VS建立了一個新的ASP.NET MVC應用程序後,將自動向這個項目中添加一些文件和目錄,如圖所示3-1所示。跨域
圖3-1 asp.net mvc 項目目錄結構 瀏覽器
表3-1是對目錄的說明 服務器
表3-1 asp.net mvc程序結構說明 架構
目錄mvc |
用途框架 |
/Controllerasp.net |
用於保存那些處理URL請求的Controller的派生類工具 |
/Models |
用於保存那些表示和操縱數據以及業務對象的類 |
/Views |
存那些負責呈現輸出結果(如HTML)的UI模板文件 |
/Scripts |
保存Js庫文件和腳本 |
/fonts |
用於保存Bootstrap模板系統中的字體文件 |
Content |
用於保存CSS、圖像和其餘站點的內容,而非腳本 |
/App_Data |
保存想要讀取/寫入的數據文件好比.mdf的本地數據庫文件 |
/App_Start |
保存一些同能的配置代碼,路由等 |
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框架的一大特色就是"約定勝於配置",即一些規則是約定好的,不須要經過配置文件去配置。咱們約定:
對象名稱 |
說明 |
Request |
用來獲取客戶端在web請求期間發送的值,如URL參數、表單值等 |
Response |
用來負責返回到客戶端的HTTP輸出 |
Application |
做用於整個應用程序運行期間的狀態對象,可用來保存整個應用程序的配置參數 |
Session |
會話狀態保持對象 |
Cookie |
客戶端保持會話信息的方式 |
Server |
用於進行一些服務器端處理的工具對象,如URL,編碼解碼 |
HttpContext |
封裝有關個別HTTP請求的全部HTTP特定信息 |
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請求保存到磁盤 |
成員 |
說明 |
String ContentType |
獲取或設置輸出流的HTTP MIME類型 |
HttpCookieCollection Cookies |
獲取相應Cookie的集合 |
NameValueCollection Headers |
獲取相應標頭的集合 |
Redirect(url) |
將請求重定向到新的URL |
Write(data) |
將一個字符串寫入HTTP相應輸出流 |
經常使用成員 |
說明 |
string MapPath(path) |
返回與Web服務器上的指定虛擬路徑相對應的物理文件路徑 |
Transfer |
使用指定的path路徑進行轉發 |
string UrlDecode |
對字符串進行URL編碼 |
string UrlEncode |
對字符串進行URL解碼 |
在Asp.net 中,Session以key-value的方式在服務器端保存數據,它的使用方式很是簡單,以下。
Session["Session名稱"] = 值; //存值
變量 = Session["Session名稱"]; //取值
Session對象經常使用成員:
經常使用成員 |
說明 |
string SessionId |
包含惟一用戶會話標識符,它可用與整個會話過程記錄用戶的信息 |
int Timeout |
用戶超時的時間,單位分鐘。在該段時間內,用戶即便沒有任何操做用戶的狀態也不會清除。若是一段時間內沒有操做,服務器沒法知道用戶是否在線,因此Session中的數據生存期以超時時間爲限 |
Abandon() |
結束Session,取消當前會話 |
Add(name,value) |
添加Session數據 |
Remove(name) |
刪除數據 |
語法:
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永遠不會過時 |
經常使用成員 |
說明 |
HttpApplicationState Application |
Application對象 |
HttpRequest Request |
Request對象 |
HttpResponse |
Response對象 |
HttpServerUtility Server |
Server對象 |
HttpSessionState |
Session對象 |
Iprincipal User |
User對象 |
Cache |
Cache對象 |
static HttpContext Current |
爲當前Http請求獲取或設置HttpContext對象 |
需求:
在登陸控制器中引用命名空間
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");
}
}
}