1. 程式人生 > >【MVC】View與Control之間數據傳遞

【MVC】View與Control之間數據傳遞

nco 所有 action inf 第一行代碼 dynamic ech view method

1、 Controller向View傳遞數據

  • 使用ViewData傳遞數據【弱類型,字典型ViewDataDictionary】

  ViewData[“Message_ViewData”] = “ Hello ViewData!”;

  在View中讀取Controller中定義的ViewData數據,代碼如下:

  @Html.Encode(ViewData["Message_ViewData"])

  • 使用ViewBag傳遞數據 【動態型,dynamic】

  我們在Controller中定義如下:ViewBag.Message_ViewBag = “ Hello ViewBag !”;

  • 使用TempData傳遞數據 【弱類型,臨時存儲,一次性獲取就沒了,實際上保存在Session中】

  我們在Controller中定義如下:TempData[“Message”] = “Hello word!”;

  • 使用Model傳遞數據 【強類型】

  創建強類型的View以後,View的第一行代碼如下所示:@model Test.Models.HelloModel

  就代表了這個View使用的Model為“Test.Models.HelloModel”

  然後在View中讀取Model中定義的數據,代碼如下:@Html.Encode(Model.Name)

2、View向Controller傳遞數據

  主要通過 發送表單的方式來實現。具體的方式有:

  • 通過Request.Form讀取表單數據【post】
@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post)) 

{ 

    @Html.TextBox("Name"); 

    @Html.TextBox("Text"); 

    <input type="submit" value="提交" /> 

 }

  控制器中

[HttpPost] 

       
public ActionResult HelloModelTest() { string name= Request.Form["Name"]; string text= Request.Form["Text"]; return View(); }

  或者

[HttpPost] 

        public ActionResult HelloModelTest(FormCollection fc) 

        { 

            string name= fc["Name"]; 

            string text  = fc["Text"]; 

            return View(); 

        }
  • 模型綁定
@*為了下面的submit可以post提交到eidt*@
@using (Html.BeginForm("Edit", "TestMovie", FormMethod.Post))
{
    //為了防止“過多發布”攻擊,請啟用要綁定到的特定屬性,控制器中加特性[ValidateAntiForgeryToken]
    @Html.AntiForgeryToken()
    <div>
        <input type="submit" value="保存" class="btn btn-default" />
    </div>
}

也可以
@using (Html.BeginForm())
{
    <input type="submit" value="刪除" class="btn btn-default" />
}

  控制器中

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,Title,Director,Date")] MovieDB movieDB)

或者 public ActionResult Edit(MovieDB movieDB) //這個默認的模型綁定
        {
            if (ModelState.IsValid)
            {
                db.Entry(movieDB).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(movieDB);
        }

  當你的Action方法是以一個模型對象充當參數時,MVC運行時將會用模型綁定來構建該參數。

默認用於模型綁定的是 DefaultModelBinder,以上述的HelloModel為例,DefaultModelBinder將會檢索出所有可用的HelloModel屬性用於綁定模型。

根據命名約定,DefaultModelBinder能夠自動地在請求中獲取相應的值來填充HelloModel對象(它還能創建一個對象的實例來填充)

換句話說:假設HelloModel有一個Name屬性,那麽模型綁定就會在請求中查找名為Name的參數。註意我說的是在“請求中”,而不是“表單集合”中。

模型綁定會在請求中的各個方面進行值查找,這裏面包括路由數據,查詢字符串,表單集合。有必要的話你還可以添加自定義的值提供信息。

模型綁定不並局限於Http Post及復雜參數(如HelloModel),你完全可以傳入一個原始的簡單參數:

public ActionResult HelloModelTest( string name,string text)

// ….

在該場景中,模型綁定將會在請求中查找名。

【MVC】View與Control之間數據傳遞