一,ViewData,ViewBag與TempData
ASP.NET MVC架構中,通過繼承在Controller中的ViewData,ViewBag和TempData和View頁面進行資料的存取,並且適合於少量的資料傳遞。
1.1 ViewBag
ViewBag可以產生動態屬性,我們新建項目中看到ViewBag的使用方法:
Controller中賦值:ViewBag.Title=”首頁” View中獲取值 @ViewBag.Title
1.2 ViewData
Controller中賦值:ViewData[“message”]=”This is ViewData Value”;
View頁面中取值:@ViewData[“message”]
1.3 TempData
和ViewBag,ViewData不同的是,TempData預設把資料存放於Session,
其生命週期存在於以整個Request的範圍,可以在Controller和Controller之間做資料的傳遞
class="code_img_closed" src="/Upload/Images/2014100219/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('61f6dec7-9348-43a5-a4eb-a9d07b2798fd',event)" src="/Upload/Images/2014100219/2B1B950FA3DF188F.gif" alt="" />public ActionResult Index() { //ViewData ViewData["ViewDataValue"] = "This is ViewData Value"; //TempData TempData["TempDataValue"] = "This is TempData Value"; //ViewBag ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。"; return View(); }View Code
<hgroup class="title"> <h1>@ViewBag.Title.</h1> <h2>@ViewBag.Message</h2> <h3>@ViewData["ViewDataValue"]</h3> <h3>@TempData["TempDataValue"]</h3> </hgroup>View Code
二, 模型連接(Model Binding)
ASP.NET MVC中會使用模型連接(Model Binding)使Controller獲取View中的資料。
2.1簡單的模型連接
如下示例,View頁面有個id為Content的文本框,對應的Action中有同名的參數Content,這樣當Action被執行的時候程序會通過DefaultModelBinder類別把View頁面傳遞過來的資料傳入Action中的同名參數。
View:
@using(Html.BeginForm()){ <div>@Html.Label("請輸入Content內容: ")<input type="text"/ name="content"></div> <div>@Html.Label("您輸入的內容為:")@ViewData["content"]</div> <input type="submit" value="提交"/> }
Action:
public ActionResult TestAction(string content) { ViewData["Content"] = content; return View(); }
我們下斷點看一下,點擊提交以後,會通過簡單的數據連接模型把content文本框中的值傳遞到TestAction的參數中,然後通過ViewData["Content"]把值取出。
2.2 FormCollection
ASP.NET MVC除了簡單的模型連接取得View頁面資料外,還可以通過FormCollection來取得整個客戶端頁面的資料。
在Action中加入FormCollection參數以後即可取得表單資料。
View:
@{
ViewBag.Title = "TestAction";
}
<h2>TestAction</h2>
@using(Html.BeginForm()){
<div>@Html.Label("請輸入Content內容: ")<input type="text"/ name="content"></div>
<div>@Html.Label("您輸入的內容為:")@ViewData["content"]</div>
<input type="submit" value="提交"/>
}
View Code
Action:
//FormCollection
public ActionResult TestAction(FormCollection form)
{
ViewData["Content"] = form["content"];
return View();
}
View Code
2.3複雜模型連接
1,我們添加TestFormModel類,類中定義三個屬性
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; namespace MvcApplication3.Models { public class TestFormModel { public string Content { get; set; } public string UserID { get; set; } public int Age { get; set; } } }View Code
2,Action參數更改為TestFormModel類別,來接收View頁面傳遞過來的Form表單,
只要Form表單裏面的欄位名稱和Model類別中的屬性一一對應,即可完成接收動作
View:
@{ ViewBag.Title = "TestForm"; } <h2>TestForm</h2> @using (Html.BeginForm()) { <div> @Html.Label("请输入Content内容:") <input name="content" type="text" /> </div> <div>@Html.Label("请输入UserID:")<input name="UserID" type="text" /></div> <input type="submit" value="提交" /> <div> 您提交的内容为:content= @ViewData["Content"] <br /> userID= @ViewData["UserID"] </div> }View Code
Action,記得添加引用Model
//複雜模型连接 public ActionResult TestForm(TestFormModel form) { ViewData["Content"] = form.Content; ViewData["UserID"] = form.UserID; return View(); }View Code
3,View頁面輸入的值通過Form表單以Model類的格式傳遞到Controller之後,通過ViewData讀出來
我們下斷點調試可以看到,數據的傳遞:
2.4 判斷模型驗證結果
上一個例子我們看到View中的Form表單數據默認和Model類中的屬性一一對應,這樣我們就可以把數據驗證的部分放到Model中進行處理。
Controller中在處理模型連接的時候,程序會自動處理模型驗證的工作,驗證的結果儲存與ModelState物件中。
現在我們更新Model中的屬性,前面加[Required]表示這個屬性必須有值的時候ModelState. IsValid==true
Model:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; namespace MvcApplication3.Models { public class TestFormModel { [Required] public string Content { get; set; } [Required] public string UserID { get; set; } [Required] public int Age { get; set; } } }
View:
@{ ViewBag.Title = "TestForm"; } <h2>TestForm</h2> @using (Html.BeginForm()) { <div> @Html.Label("请输入Content内容:") <input name="content" type="text" /> </div> <div>@Html.Label("请输入UserID:")<input name="UserID" type="text" /></div> <input type="submit" value="提交" /> <div> 您提交的内容为:content= @ViewData["Content"] <br /> userID= @ViewData["UserID"] </div> <div>Model中的數據驗證狀態:@ViewData["Message"]</div> }
Action:當兩個文本框都輸入值的時候,驗證成功 否則失敗
////模型验证 public ActionResult TestForm(TestFormModel form) { if (ModelState.IsValid) { //Model中的数据符合规范 ViewData["Message"] = "驗證通過"; ViewData["Content"] = form.Content; ViewData["UserID"] = form.UserID; } else { ViewData["Message"] = "驗證失敗"; } return View(); }