本系列目錄:ASP.NET MVC4入門到精通系列目錄匯總
Controller主要負責響應用戶的輸入。主要關注的是應用程序流,輸入數據的處理,以及對相關視圖(View)輸出數據的提供。
- 繼承自:System.Web.Mvc.Controller
- 一個Controller可以包含多個Action. 每一個Action都是一個方法, 返回一個ActionResult實例
- 一個Controller對應一個xxController.cs控制文件,對應在View中有一個xx文件夾。一般情況一個Action對應一個View頁面
Controller Action方法參數與返回值
Action方法接收參數:
a.接收瀏覽器傳過來的參數(get-兩種格式/post)
a1.接收FormCollection Request.Form
1.通過Request.Form["name"] 逐個獲取 表單提交的數據
在View視圖中
@Html.TextBoxFor(x => x.CusName, new { @class = "trade-timen", @id = "cusName" })<span class="wtps">* @Html.ValidationMessageFor(m => m.CusName)
控制器中
[HttpPost]
public string UpdateCustomerInfo(FormCollection form)
{
return Request.Form["CusName"];;
}
注意:在View界面要存在name屬性為CusName的表單元素,因為提交表單數據的時候,只會提交所有帶name標簽的數據。
2.通過 FormCollection form逐個獲取 表單提交的數據
[HttpPost]
public string UpdateCustomerInfo(FormCollection form) { return form["CusName"];
}
a2.接收Model
通過 實體對象 一次性獲取 表單元素的數據,並設置到實體對象對應的屬性中
/// <summary>
/// 修改客戶
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
public ActionResult UpdateCustomer(CustomerInfo info)
{
string msg = string.Empty;
if (ModelState.IsValid)
{
try
{
CustomerInfo model = CustomerInfo.Load(info.ID);
model.CusCode = info.CusCode;
model.CusName = info.CusName;
model.Phone = info.Phone;
model.Tel = info.Tel;
model.Email = info.Email;
model.Fax = info.Fax;
model.Country = info.Country;
model.Address = info.Address;
model.CompanyName = info.CompanyName;
model.BusssinessType = info.BusssinessType;
model.Status = info.Status;
model.Update();
msg = "修改客戶成功。";
}
catch (Exception ex)
{
msg = "修改客戶失敗!" + ex.Message;
ViewBag.Msg = string.Format(message, msg, false, "1");
}
ViewBag.Msg = string.Format(message, msg, true, "0");
}
return View();
}
注意: 表單中的表單元素的屬性名稱必須和實體對象的屬性一樣!
折疊類中所有方法:ctrl+m+o
折疊類中所有的代碼塊,包括類:ctrl+m+l
b.接收Get數據,Request.QueryString
直接通過請求上下文對象里的 Request獲取 url ?后的的參數:
瀏覽器請求路徑為:/User/UserList/1?kjy=jp
控制器獲取:Request.QueryString["kjy"];
Action方法輸出返回值:
b1.string:直接 返回響應報文字符串;
b2.ActionResult:返回控制器結果對象
(里面會包含什么呢?能做什么呢?)
b3.JsonResult:返回 Json 字符串
Action的返回值-ActionResult
Action指定使用視圖
public ActionResult Index() { return View();//默認情況下不給參數返回和方法同名的視圖,即使用視圖 Index.cshtml 路徑在當前控制器對應的View目錄下面 return View("OtherIndex");//使用 OtherIndex.cshtml return View("~/Views/Home/Test.cshtml"); }
Controller是如何向View進行數據傳輸的呢?
控制器將處理后的數據“傳”給視圖的方式
ViewData/ViewBag/TempData/Model
我們先來看下示例
控制器代碼:
public ActionResult Index() { ViewBag.UserName = "小李飛刀"; ViewData["UserName"] = "陸小鳳"; TempData["UserName"] = "楚留香";//臨時數據 User model = new User { UserName = "謝曉峰" }; return View(model); //這行代碼其實就相當於ViewData.Model=model }
View代碼:
@{ ViewBag.Title = "Index"; } <div>@ViewBag.UserName </div> <div>@ViewData["UserName"] </div> <div>@TempData["UserName"] </div> <div>@Model.UserName</div>
Model其實就是ViewData.Model
大家可能覺得這十分顯而易見,結果肯定是

發現,只要從TempData中取出一個元素,就會立即將此元素移除!
Model 強類型參數
在控制器里的Action方法最后 調用View加載視圖的時候,將 數據對象傳入。
return View(model);
視圖中,可以通過 Model屬性獲取!並且不需要轉型就可以直接使用!
注意:Model雖然可以不轉型就直接使用,但是 因為編譯器無法在編譯時獲取它的類型,所以就無法出現智能提示!為了解決這個問題,我們可以在試圖的最上面通過代碼指定model類型
查看源碼:
當我們在試圖上添加了 @model指令時

當前視圖就會繼承於 WebViewPage<T> 強類型視圖頁面類,並且指定T為Student:

如果沒有添加@model指令:當前視圖就會繼承於 WebViewPage<T> 強類型視圖頁面類,但T變成了 dynamic
到這里,Controller的數據怎么就傳到View了,我明明只給Controller中的ViewData/ViewBag/TempData/賦值了,或者只把對象傳給了View方法。
為什么View中就可以直接調用了呢?我們知道以前的ASP.NET,aspx和aspx.cs是一個繼承關系,子類可以直接調用父類的屬性方法。你ASP.NET MVC中View和Controller之間又有什么關系呢?
View和Controller中都有ViewData/ViewBag/TempData這幾個對象,在給Controller中這些對象賦值后,Controller會把這些值賦值給View中對應的這幾個對象。
本系列目錄:ASP.NET MVC4入門到精通系列目錄匯總