一,基本概念:
控制器涉及的內容有三部分: 控制器(Controller) 、控制器方法(Action)和 控制器結果(ActionResult)。
傳統的Web架構,如ASP/PHP/ASP.NET Web Forms 等等,請求的URL 地址都是映射到特定的檔案。如,請求的URL 地址,像/Products.aspx 或/Products.php,由 Products.aspx 或Products.php 檔案負責處理。基於Web的MVC架構 映射URL地址 到伺服器端代碼有點不同,不是映射URL 地址到特定檔案,而是映射到類的方法上。這些類就是MVC 中的 Controller 控制器,它們負責處理進來的請求和使用者輸入,接收和儲存資料,並返回結果給用戶端(顯示HTML、下載檔案、或重新導向到不同的URL 等等)。
二,控制器(Controller):
右鍵點擊Web 項目中的Controllers 檔案夾,選擇 添加(Add) ->控制器(Controller),如所示。
在彈出的Add Controller 對話方塊,控制器名稱輸入GuestBookController,點擊Add 按鈕。ok,我們已經在專案檔中添加了GuestBookController.cs 檔案。
代碼如下:
public class GuestBookController : Controller
{
//
// GET: /GuestBook/
public ActionResult Index()
{
return View();
}
}
注意:約定控制器必須以Controller結尾,樣式為xyzController.cs。
三,Action方法:
1,能夠通過URL訪問的Action必須是公有(public)方法;
2,如果標記了[NonAction]屬性,則不能通過URL訪問;
例如:
[NonAction]
public ActionResult Index()
{
return View();
}
不能通過GuestBook/Index來訪問了。
3,預設情況下,Action的方法名就是Action名,Action名指可以通過URL訪問的名稱。
如有需要,您可以指定Action名。例如:
[ActionName("Default")]
public ActionResult Index()
{
return View("Index");//改變了Action名,就要指定視圖名稱,不指定就會顯示Default視圖檔案。
}
這樣,您可以通過GuestBook/Default來訪問這個Action了。
4,還有兩個常用的屬性是[HttpPost]和[HttpGet]。例如:
[HttpPost]
public ActionResult Index()
{
return View();
}
表示該方法負責處理Http Post動作。
也可以通過 [AcceptVerbs(HttpVerbs.Post)]來設定,[HttpPost]效果一樣,只是方便快速開發。
當對重載的action 方法添加[HttpPost] 屬性後,ASP.NET MVC 根據進來的HTTP 動作,自動分發請求
給合適的action 方法。例如:
[HttpPost]
[ActionName("Index")]
public ActionResult IndexPost()
{
return View();
}
public ActionResult Index()
{
return View("Index");
}
URL請求GuestBook/Index時,如果是Http Post請求,則由名稱為IndexPost的方法執行;其它的請求,則由名稱為Index的方法執行。
如果想瞭解post和get以外更多的參數,請參考(英文):
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
或者搜尋AcceptVerbs。
5,過濾器屬性Action Filter:
可以放置在Action上的另一種類型的屬性是過濾器(Filter)。
使用過濾器可以添加緩衝、 驗證和錯誤處理。
例如[HandleError]屬性。
我們先去掉中的[HandleError]屬性,然後添加如下代碼:
public ActionResult HandleError()
{
throw new Exception("出現異常");
}
訪問Home/HandleError,出現如,異常頁面暴露了部分原始碼,給網站安全帶來隱患。
現在,我們設定 [HandleError]屬性。
[HandleError]
public class HomeController : Controller
然後,在web.config中找到<customErrors>節,把mode設定為"On",去掉注釋。如。
再次運行Home/HandleError,會顯示Shared目錄下的Error.aspx個人化異常頁面。
這是一個過濾器的例子,更多的內容我們將在後面過濾器的章節中詳細說明。
注意:可以將此屬性應用於單獨的一個Action方法上,或者Controller類上,這樣它可以應用於這個控制器類的所有Action.
6,Action方法的參數:
例如URL為:GuestBook/Index/12345,
Index這個Action的代碼為:
public ActionResult Index(int id)
{
int myid=id;
return View("Index");
}
我們調試此URL,就會發現,myid的值是12345。
我們並沒有使用類似int id = Convert.ToInt32(Request["id"]);的代碼。
這是因為:
預設情況下,action方法的參數值從請求的資料集合中檢索。
資料集包括,Form、URL Routing Data、QueryString、cookie values等等。
Action 參數的資料首先會從當前請求的form表單中取值,之後是route解析過的route values,最後是從QueryString中取得所前面沒有重複出現過的值。重複出現的以最先取的值為優先。
四,控制器結果(ActionResult):
1,成功執行 MVC 控制器操作會產生從 ActionResult 派生的對象。
2, ActionResult 衍生類別型包括:
ViewResult. 呈現視圖頁給用戶端。由View 方法返回.
EmptyResult. 不寫入HTTP 響應。
RedirectResult. 重新導向到另外一個URL。由 Redirect 方法返回.
RedirectToRouteResult. 重新導向到另外一個Route。由RedirectToAction 和RedirectToRoute 方法返回.
FileContentResult,表示一個可下載的檔案,有File方法返回.
ContentResult.將動作結果作為純文字返回。由 Content 方法返回.
JsonResult. 返回JSON結果。由 Json 方法返回.
JavaScriptResult.返回一個JavaScript對象,由JavaScriptResult方法返回。
3,你也可建立返回任何類型的action方法,如字串、整數、或布爾值等等。在這些傳回值呈現給返迴流之前,將封裝為合適的ActionResult類型。例如,如果設定傳回型別為string或日期,會自動轉換為ContentResult類型結果返回。
下一節中我們將介紹視圖。