ASP.NET MVC 4.0 学习6-Model Binding
一,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之間做資料的傳遞
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();
}
ASP.NET MVC 4.0 学习6-Model Binding的更多相关文章
- ASP.NET MVC 4.0 学习5-ActionResult
一,Controller簡介 Controller擔任了資料傳遞的角色,負責流程控制,決定存取哪個Model以及決定顯示哪個View頁面,即ASP.NET MVC中有關於『傳遞』的任務皆由Contro ...
- [ASP.NET MVC 小牛之路]15 - Model Binding
Model Binding(模型绑定)是 MVC 框架根据 HTTP 请求数据创建 .NET 对象的一个过程.我们之前所有示例中传递给 Action 方法参数的对象都是在 Model Binding ...
- ASP.NET MVC 4.0 学习2-留言板實現
新增專案實現留言板功能,瞭解MVC的運行機制 1,新增專案 2,添加數據庫文件message.mdf Ctrl+W,L 打開資料庫連接,添加存放留言的Atricle表 添加字段,後點擊&quo ...
- ASP.NET MVC 4.0 学习3-Model
Model負責獲取數據庫中的資料,並對數據庫中的數據進行處理. MVC中有關 數據庫 的任務都由Model來完成,Model中對數據資料進行定義,Controller和View中都會參考到Model, ...
- ASP.NET MVC 4.0 学习1-C#基础语法
1,方法多載,相同的方法名稱,不同的參數類型.數量 class Program { static void Main(string[] args) { Program newObject = new ...
- ASP.NET MVC 4.0 学习4-Code First
之前我們需要用到的數據,通過添加Entity實體數據模型把數據庫中需要的Database拉到項目中如下圖, 而就是Code First就是相對於這種處理數據的方法而言的 Code First更加準確的 ...
- 系列文章--从零开始学习ASP.NET MVC 1.0
从零开始学习ASP.NET MVC 1.0 (一) 开天辟地入门篇 从零开始学习 ASP.NET MVC 1.0 (二) 识别URL的Routing组件 从零开始学习 ASP.NET MVC 1.0 ...
- [ASP.NET MVC 小牛之路]16 - Model 验证
上一篇博文 [ASP.NET MVC 小牛之路]15 - Model Binding 中讲了MVC在Model Binding过程中如何根据用户提交HTTP请求数据创建Model对象.在实际的项目中, ...
- 从零开始学习ASP.NET MVC 1.0
转自:http://www.cnblogs.com/zhangziqiu/archive/2009/02/27/ASPNET-MVC-1.html <从零开始学习ASP.NET MVC 1.0& ...
随机推荐
- [TYVJ] P1017 冗余关系
冗余关系 背景 Background 太原成成中学第3次模拟赛 第4题 描述 Description Mrs.Chen是一个很认真很称职的语文老师 ......所以,当她看到学生作文里的人物关系描 ...
- codechef Prime Distance On Tree(树分治+FFT)
题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...
- ADO.Net对Oracle数据库的操作【转载】
一 ADO.Net简介 访问数据库的技术有许多,常见的有一下几种:开放数据库互联(ODBC).数据访问对象(DAO).远程数据对象 (RDO). ActiveX数据对象(ADO).我们今天主要要学习A ...
- GestureDetector和SimpleOnGestureListener的使用教程
1. 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vi ...
- HDU 1540 Tunnel Warfare (线段树)
题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...
- HDU3336——KMP算法
题意是问所有前缀出现的次数和,mod10007: 想一想next数组代表什么意思,是从当前失配位置走到上一个匹配位置的后面,next[i]的值说明以当前位置为结尾,长度为next[i]的后缀,与以开头 ...
- 【LeetCode练习题】Valid Palindrome
Valid Palindrome Given a string, determine if it is a palindrome, considering only alphanumeric char ...
- POJ 2010 Moo University - Financial Aid 优先队列
题意:给你c头牛,并给出每头牛的分数和花费,要求你找出其中n(n为奇数)头牛,并使这n头牛的分数的中位数尽可能大,同时这n头牛的总花费不能超过f,否则输出-1. 思路:首先对n头牛按分数进行排序,然后 ...
- The method setOnClickListener(View.OnClickListener) in the type View is not applicable
开始学习 android 了,学习的是高明鑫老师的android视频教程(android视频教学). 学到第八讲时, 在写动态设置时报错: The method setOnClickListener( ...
- 如何在cmd窗口启动Tomcat
平时,一般使用tomcat/bin/startup.bat目录在windows环境启动Tomcat,或者使用IDE配置后启动. 下面来简单介绍下如果在cmd窗口直接输入命令启动Tomcat: 1.将t ...