ASP.NET MVC 4.0 学习6-Model Binding

一,ViewData,ViewBagTempData

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之間做資料的傳遞

  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();
        }

 

posted @ 2014-10-02 18:24  hishanghai  阅读(1319)  评论(1编辑  收藏  举报