九、ASP.NET MVC入門到精通——Controller(控制器)

本系列目錄:ASP.NET MVC4入門到精通系列目錄彙總html

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"] 逐個獲取 表單提交的數據post

在View視圖中url

  @Html.TextBoxFor(x => x.CusName, new { @class = "trade-timen", @id = "cusName" })<span class="wtps">* @Html.ValidationMessageFor(m => m.CusName)

控制器中spa

 [HttpPost]
public string UpdateCustomerInfo(FormCollection form)
{
return  Request.Form["CusName"];;
 }

注意:在View界面要存在name屬性爲CusName的表單元素,由於提交表單數據的時候,只會提交全部帶name標籤的數據。3d

 2.經過 FormCollection form逐個獲取 表單提交的數據code

[HttpPost]
public string UpdateCustomerInfo(FormCollection form) { return form["CusName"];
}

   a2.接收Modelorm

經過 實體對象 一次性獲取 表單元素的數據,並設置到實體對象對應的屬性中htm

        /// <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

你們可能以爲這十分顯而易見,結果確定是

小李飛刀
陸小鳳
楚留香
謝曉峯
但是,我要告訴你,結果並非像你想象的那樣,而是會顯示爲這樣:
陸小鳳
陸小鳳
楚留香
謝曉峯
爲何呢?由於ViewData ViewBag 本質上都是【ViewDataDictionary】類型,而且二者之間的數據共享,只不過提供了不一樣的語法操做方式而已。
因此「陸小鳳」覆蓋了原先的值」小李飛刀「。
TempData,看名稱咱們就知道,只用來臨時存儲的,存儲一次就失效了,不會再共享啊什麼的。
打開我一直吐血推薦的犀利工具Reflector,咱們來看下源碼
咱們看到HomeController : Controller,public abstract class Controller : ControllerBase

發現,只要從TempData中取出一個元素,就會當即將此元素移除!

Model 強類型參數

在控制器裏的Action方法最後 調用View加載視圖的時候,將 數據對象傳入。

return View(model);

視圖中,能夠經過 Model屬性獲取!而且不須要轉型就能夠直接使用!

注意:Model雖然能夠不轉型就直接使用,可是 由於編譯器沒法在編譯時獲取它的類型,因此就沒法出現智能提示!爲了解決這個問題,咱們能夠在試圖的最上面經過代碼指定model類型

 

查看源碼:
當咱們在試圖上添加了 @model指令時 

當前視圖就會繼承於 WebViewPage<T> 強類型視圖頁面類,而且指定TStudent
 
  

 若是沒有添加@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入門到精通系列目錄彙總

相關文章
相關標籤/搜索