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

 <hgroup class="title">
                <h1>@ViewBag.Title.</h1>
                <h2>@ViewBag.Message</h2>
                <h3>@ViewData["ViewDataValue"]</h3>
                <h3>@TempData["TempDataValue"]</h3>

 </hgroup>

二,  模型連接(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="提交"/>
}

Action:

  //FormCollection
        public ActionResult TestAction(FormCollection form)
        {
            ViewData["Content"] = form["content"];
            return View();
        }

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

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

Action,記得添加引用Model

    //複雜模型连接
        public ActionResult TestForm(TestFormModel form)
        {
            ViewData["Content"] = form.Content;
            ViewData["UserID"] = form.UserID;

            return View();
        }

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();
        }
时间: 2024-10-21 05:18:53

ASP.NET MVC 4.0 学习6-Model Binding的相关文章

ASP.NET MVC 4.0 学习2-留言板實現

新增專案實現留言板功能,瞭解MVC的運行機制 1,新增專案   2,添加數據庫文件message.mdf   Ctrl+W,L 打開資料庫連接,添加存放留言的Atricle表 添加字段,後點擊"更新"後看到新增的Atricle表(Content 應該設置為text) 3,添加ADO.NET實體數據模型 (MVC通過實體數據模型對數據庫中的數據進行增删改查)              ADO.NET實體數據模型添加完成. 4,建立Service 我們把對Model中message.mdf

ASP.NET MVC 4.0 学习4-ActionResult

一,Controller簡介 Controller擔任了資料傳遞的角色,負責流程控制,決定存取哪個Model以及決定顯示哪個View頁面,即ASP.NET MVC中有關於『傳遞』的任務皆由Controller負責. Controller的執行階段負責呼叫執行Model中的資料處理,並把處理結果數據傳送到對應的View. Controller即為一個Class類,類中包含很多Method方法,方法中進行流程處理. Controller有以下特點: 類必須是Public公開類 類名稱必須以Contr

ASP.NET MVC 4.0 学习3-Model

Model負責獲取數據庫中的資料,並對數據庫中的數據進行處理. MVC中有關 數據庫 的任務都由Model來完成,Model中對數據資料進行定義,Controller和View中都會參考到Model,從而對數據庫進行增刪改的操作.      Model不需要依賴Controller或是View,所以Model的獨立性很高,我們可以把Model獨立出來一個專案. 1,Model中添加實體數據模型 DB中添加新的DataBase:message,添加Table:MessageBoard USE [m

ASP.NET MVC 4.0 学习4-Code First

之前我們需要用到的數據,通過添加Entity實體數據模型把數據庫中需要的Database拉到項目中如下圖, 而就是Code First就是相對於這種處理數據的方法而言的 Code First更加準確的解讀是開發人員只需要編寫程式(Code Only),系統會自動建立模型和數據庫 我們來新建一個專案看一下Code First的具體實現 1,新專案的Model中加入類別MessageBoard存儲留言信息 MessageBoard.cs中添加字段屬性: using System; using Sys

asp.net mvc 3.0 知识点整理 ----- (2).Controller中几种Action返回类型对比

通过学习,我们可以发现,在Controller中提供了很多不同的Action返回类型.那么具体他们是有什么作用呢?它们的用法和区别是什么呢?通过资料书上的介绍和网上资料的查询,这里就来给大家列举和大致的概括下. (1). ActionResult(base):最基本的Action类型,返回其他类型都可以写ActionResult. (2). ContentResult:返回ContentResult用户定义的内容类型. public ActionResult Content() { return

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.supervisor.mysql环境搭建搭建好了.net core linux的相关环境,今天就来说说ef core相关的配置及迁移: 简介: Entity Framework(以下简称EF) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,EF Core是Entity

ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新的区域,可以让我们的项目不至于太复杂而导致管理混乱.有了区域后,每个模块的页面都放入相应的区域内进行管理很方便.例如:上图中有两个模块,一个是Admin模块,另一个是Product模块,所有关于这两个模块的控制器.Model以及视图都放入各自的模块内.可以从上图中看出,区域的功能类似一个小的MVC项

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分