ASP.NET MVC中controller和view相互傳值的方式

  ASP.NET MVC中Controller向view傳值的方式

  1. ViewBag、ViewData、TempData
  2. 單個值的傳遞
  3. Json
  4. 匿名類型
  5. ExpandoObject
  6. Cookie
  7. ViewModel(向普通View頁面傳個Model對象、向強類型頁面傳一個Model對象、用一個ViewModel對象解決所有問題)

  ASP.NET MVC中view向Controller傳值的方式

  1. QueryString
  2. RouteData
  3. Model Binding(form、使用和Action參數同名的變量進行傳遞)
  4. Cookie

  在MVC中ViewBag的作用是數據的傳遞。在MVC3開始,視圖數據能夠通過ViewBag屬性訪問。在MVC2中則是使用ViewData。MVC3中保留了ViewData的使用。ViewBag是動態類型的(dynamic),ViewData是一個字典型的(Dictionary)。

MVC3中ViewBag和ViewData的差別:

ViewBag不再是字典的鍵值對結構,而是dynamic動態類型的。 它會在程序執行的時候動態解析。

所以在視圖中獲取它的數據時候不須要進行類型轉換

ViewDataViewBag
它是Key/Value字典集合它是dynamic類型對像
從Asp.net MVC 1 就有了ASP.NET MVC3 才有
基于Asp.net 3.5 framework基于Asp.net 4.0與.net framework
ViewData比ViewBag快ViewBag比ViewData慢
在ViewPage中查詢數據時須要轉換合適的類型在ViewPage中查詢數據時不須要類型轉換
有一些類型轉換代碼可讀性更好

View向Controller中傳遞數據的方式

QueryString

View中代碼:

復制代碼
<div><button id="btn">提交</button>
</div>
<script>$(function () {$('#btn').click(function () {//url不區分大小寫location.href = "/home/getvalue?method=querystring";});});
</script>
復制代碼

Controller中代碼:

public void GetValue()
{//Request屬性可用來獲取querystring,form表單以及cookie中的值var querystring = Request["method"];
}

使用querystring向后臺傳遞屬于http協議中的get方式,即數據會暴露在url中,安全性不高(可通過瀏覽器歷史記錄看到發送的數據)且傳遞的數據量有大小限制。
點擊提交按鈕后瀏覽器地址欄中的地址:http://localhost:57625/home/getvalue?method=querystring。程序執行結果如下:

RouteData

路由可以讓我們寫出可讀性較高的url,使用路由傳遞數據,首先要配置合適的路由:

routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}"
);

前端代碼只需要將location.href的值改為和路由匹配的url即可,本示例中為"/home/getvalue/100"
Controller中的代碼:

public void GetValue()
{var value = RouteData.Values["id"];
}

獲取的值是object類型:


獲取路由參數的另外一種方式是給Action設置一個和路由模板中指定的參數名一致(不區分大小寫)的參數即可,代碼如下:

public void GetValue(int id)
{}

注意,這里不僅獲取了路由數據,而且自動將數據類型轉換為int類型:

querystring和路由均是通過url進行數據的傳遞,若數據中包含中文應進行Encode操作。此外,url的長度是有限制的,使用url不可傳遞過多的數據。url傳遞參數屬于Http協議中的Get請求,若要發送大量數據可以使用Post請求。

ModelBinding

1. Form

form表單形式是常見的向后端發送數據的方式,但是在提交數據是只會提交form表單內部具有name屬性input,textarea,select標簽的value值。
View中的代碼:

<form action="/home/getvalue" method="post"><input type="text" name="username" /><input type="text" name="age" /><input type="submit" name="button" value="提交" />
</form>

Controller中的代碼:

復制代碼
public void GetValue()
{var name = Request["username"];var age = Request["age"];var btn = Request["button"];
}
復制代碼

獲取到的數據均為string類型:

現在我們創建一個和form表單對應的類:

public class User
{public string UserName { set; get; }public int Age { set; get; }
}

修改Action的代碼如下:

public void GetValue(User user)
{}

然后運行程序,可以看到MVC以將表單中的數據映射為User類實例的屬性值,且進行了相應的數據類型的轉換。

2. 使用和Action參數同名的變量進行傳遞

View中的代碼:

復制代碼
<button id="btn">傳遞數據</button>
<script>$(function () {$('#btn').click(function () {$.ajax({'type': 'post', 'url': '/home/getdata',//傳遞的數據也可以是序列化之后的json格式數據//如,上面使用form表單提交數據就可以使用jquery中的serialize()方法將表單進行序列化之后在提交//data:$('#form').serialize()'data': { username: '雪飛鴻', age: '24' },error: function (message) {alert('error!');}});})})
</script>
復制代碼

?

Controller中的代碼:

public void GetData(string username, int age)
{}

在Action中成功獲取到了對應的參數值,且數據類型也根據Action中參數的類型進行了相應的轉換。

Model綁定體現在從當前請求提取相應的數據綁定到目標Action方法的同名參數中。對于這樣的一個Action,如果是Post請求,MVC會嘗試將Form(注意,這里的Form不是指html中的<form>表單,而是Post方法發送數據的方式,若我們使用開發者工具查看Post方式發送的請求信息,會看到Form Data一欄)中的值賦值到Action參數中,如果是get請求,MVC會嘗試將QueryString的值賦值到Action參數中。

Cookie

這里引用jquery.cookie插件來進行cookie的操作

復制代碼
<body><button id="btn">提交</button><script>$(function () {//向cookie中寫入值$.cookie('key', 'jscookie');$('#btn').click(function () {location.href = "/home/getvalue";});})</script>
</body>
復制代碼
public void GetValue()
{var cookie = Request["key"];
}

?

Controller向View中傳值

單個值的傳遞

復制代碼
public ActionResult Index()
{//注意,傳遞的值不能是string類型,否則會執行View(string viewName)方法而導致得不到正確結果return View(100);
}
復制代碼
<body><p>@Model</p>
</body>
程序執行結果如下:

Json

復制代碼
public ActionResult Index()
{return View();
}public JsonResult SendData()
{return Json(new { UserName = "雪飛鴻", Age = 24 });
}
復制代碼
復制代碼
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /><script src="~/scripts/jquery-1.10.2.min.js"></script>
</head>
<body><p id="message"></p><button id="btn">獲取數據</button><script>$(function () {$('#btn').click(function () {$.ajax({'url': '/home/senddata', 'type': 'post',success: function (data) {$('#message').html('用戶名:' + data.UserName + "<br/>年齡:" + data.Age);},error: function (message) {alert('error:' + message.statusText);}});});});</script>
</body>
</html>
復制代碼
程序執行結果如下:

匿名類型

public ActionResult Index()
{//使用匿名類向View中傳遞數據return View(new { UserName = "雪飛鴻", Age = 24 });
}
復制代碼
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" />
</head>
<body><p>用戶名:@Model.UserName</p><p>年齡:@Model.Age</p>
</body>
</html>
復制代碼

因為匿名類型的類型名由編譯器生成,并且不能在源代碼級使用。所以,直接使用匿名類型向View中傳遞數據,在前臺頁面是無法訪問到匿名類型中的屬性的。執行上面代碼程序會出現錯誤:

針對上述問題,使用Newtonsoft將匿名類型轉換為json格式即可解決該問題。
使用NuGet引入Newtonsoft.Json包,然后修改代碼如下:

復制代碼
public ActionResult Index()
{string json = JsonConvert.SerializeObject(new { UserName = "雪飛鴻", Age = 24 });//也可以直接序列化JSON格式的字符串//dynamic jsonObj = JsonConvert.DeserializeObject("{ UserName : \"雪飛鴻\", Age : 24 }");dynamic jsonObj = JsonConvert.DeserializeObject(json);return View(jsonObj);
}
復制代碼
程序執行結果如下:

ExpandoObject

上面提到,直接使用匿名類型向View中傳遞數據是行不通的,可以使用ExpandoObject類型對象來替代匿名類型

復制代碼
public ActionResult Index()
{dynamic user = new ExpandoObject();user.UserName = "雪飛鴻";user.Age = 24;return View(user);
}
復制代碼
程序執行結果如下:

ViewBag、ViewData、TempData

復制代碼
public ActionResult Index()
{ViewBag.Title = "數據傳遞";ViewData["key"] = "傳遞數據";//默認情況下TempData中的數據只能使用一次TempData["temp"] = "tempdata";return View();
}
復制代碼
復制代碼
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /><title>@ViewBag.Title</title>
</head>
<body><p>@ViewData["key"]</p><p>@TempData["temp"]</p>
</body>
</html>
復制代碼
程序執行結果如下:

ViewModel

通過視圖模型將數據傳遞到前端

復制代碼
//視圖模型
public class User
{public string UserName { set; get; }public int Age { set; get; }
}
//Action
public ActionResult Index()
{User user = new User() { UserName = "雪飛鴻", Age = 24 };return View(user);
}
復制代碼
復制代碼
@* 設置頁面為強類型頁面 *@
@model DataTransfer.Controllers.User
@{Layout = null;
}<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /></head>
<body><p>用戶名:@Model.UserName</p><p>年齡:@Model.Age</p>
</body>
</html>
復制代碼
程序執行結果如下:

Cookie

public ActionResult Index()
{Response.SetCookie(new HttpCookie("key", "cookie"));return View();
}
復制代碼
<body><p id="message"></p><script>$(function () {var message = $.cookie('key');$('#message').text(message);})</script>
</body>
復制代碼
程序執行結果如下:

轉載于:https://www.cnblogs.com/baojiao/p/8882566.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452925.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452925.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自定義SeekBar 實時顯示百分比進度

進度下方實時顯示百分比進度禁止掉了SeekBar的滑動事件 詳情 githus地址

數據結構與算法--3.字符串的旋轉

題目&#xff1a; A是含有n個元素的數組&#xff0c;如果可以申請到最大內存&#xff0c;那么把A從位置i開始旋轉是比較簡單的。例如&#xff1a;A:a,b,c,d,e.其中i3,旋轉后的字符串A為&#xff1a;d,e,a,b,c要求設計一個時間復雜度為O(n),空間復雜度為O(1)的算法&#xff0c;…

三網融合情況下,實時語音通信技術解決之道

隨著技術和標準的不斷成熟,伴隨著“三網合一”的大潮,VoIP可望成為下一代電信基礎設施結構的楊心,使未來各電信業務綜合統一在IP網絡上成為可能,導致數據的融合和未來電信市場的重組,并帶來新的經濟模式和價值鏈。 Internet在全世界范圍內的快速發展和語音信號處理技術的進步,促…

ipv6相對于ipv4的改進

v更大的地址空間&#xff1a;16字節&#xff0c;128位v首部的簡化&#xff1a;只有7個固定域&#xff0c;撤消了有關分段的域和校驗和域&#xff0c;以便更快地處理分組&#xff0c;提高路由器的吞吐量縮短延時。v更好地支持選項&#xff1a;選項是有次序的&#xff0c;以便路由…

輕量高效的開源JavaScript插件和庫 【轉】

圖片布局輪播圖彈出層音頻視頻編輯器字符串表單存儲動畫時間其它加載器構建工具測試包管理器CDN圖片 baguetteBox.js - 是一個簡單易用的響應式圖像燈箱效果腳本。demoLightgallery.js - 是一個功能齊全的JavaScript圖像燈箱插件。demoviewerjs - 是一個圖像預覽插件。democrop…

Linux內核中的常用宏container_of其實很簡單【轉】

轉自&#xff1a;http://blog.csdn.net/npy_lp/article/details/7010752 開發平臺&#xff1a;Ubuntu11.04 編 譯器&#xff1a;gcc version 4.5.2 (Ubuntu/Linaro4.5.2-8ubuntu4) Container_of在Linux內核中是一個常用的宏&#xff0c;用于從包含在某個結構中的指針獲得結構本…

mysql concat例子_MYSQL中CONCAT詳解

concat()函數1. 功能&#xff1a;返回結果為連接參數產生的字符串。如有任何一個參數為NULL &#xff0c;則返回值為 NULL。2. 語法concat(str1, str2,...)3. 例子案例一&#xff1a;mysql> select concat(蘋果,香蕉,梨子);------------------------------| CONCAT(蘋果,香蕉…

常見的狀態響應碼

200&#xff1a;請求正常&#xff0c;服務器正常的返回數據 301&#xff1a;永久重定向。比如在訪問www.jingdong.com的時候&#xff0c;會重定向到www.jd.com。 302&#xff1a;臨時重定向。比如在訪問一個需要登錄的界面時&#xff0c;而此時沒有登錄&#xff0c;那么就會重定…

軟件行業為什么那么多項目經理

記得聽誰說過&#xff0c;軟件行業的項目經理太濫了&#xff0c;二十幾歲的毛頭小伙子&#xff0c;動不動就是項目經理&#xff0c;手下沒幾個人&#xff0c;管的也沒幾個事&#xff0c;在其他行業&#xff0c;項目經理一般都是四五十歲的老頭子做&#xff0c;要聯系這&#xf…

ipv6的表示方法

v冒分十六進制表示法X:X:X:X:X:X:X:X 其中X表示地址中16位二進制數的十六進制值 例&#xff1a;FEDC:BA98:7654:3210:FEDC:BA98:7654:3210 v零壓縮法如其中有多個連續的零&#xff0c;則可用零壓縮法 如 &#xff1a;1080:0000:0000:0000:0008:0800:200C:417A 可寫成&am…

mysql php7安裝配置_centos7無網絡下安裝部署php7.1.33+mysql5.7.28+apache2.4.6-Go語言中文社區...

centos7無網絡下安裝部署php7.1.33mysql5.7.28apache2.4.6一、1、先ping www.baidu.com&#xff0c;root賬戶下&#xff0c;如果未聯網&#xff0c;創建目錄&#xff0c;把提前下載好的rpm包拷貝到rpm目錄下如圖&#xff1a;(如果沒有安裝包請查看我的另一篇教程下載這些安裝包…

webkit渲染

2019獨角獸企業重金招聘Python工程師標準>>> 參考鏈接 理解WebKit和Chromium 簡明魔法學院 Chrome軟件渲染 WebKit渲染基礎 Webkit 渲染基礎 Webkit不是瀏覽器,它是一個渲染引擎 軟件渲染 硬件渲染(GPU加速) 會觸發GPU加速的屬性 CSS3 3D transformation, trans…

element ui中dialog相關問題

一&#xff0c;今天需要在dialog里面引入另一個頁面&#xff0c;就是打開dialog顯示該頁面&#xff08;把頁面放到dialog中&#xff09;&#xff0c;引入的語句如下&#xff1a; <iframe src"view?pathrkdj_b" ></iframe> 二&#xff0c;使用table組件時…

數據結構與算法--4.使用堆棧模擬隊列

問題&#xff1a; 隊列的插入和刪除遵循先入先出的原則&#xff0c;而堆棧遵循后進先出的原則。用兩個堆棧模擬隊列&#xff0c;要求實現時不能分配超過O&#xff08;1&#xff09;的內存&#xff0c;時間復雜度必須是o&#xff08;m&#xff09;。 思路&#xff1a; 用兩個…

IT行業的你,在成本部門還是利潤部門

題外話&#xff1a;本文應該引起項目管理者和開發人員的思考&#xff1a;如何進行薪酬管理&#xff1f;如何規劃職業生涯&#xff1f; 生在IT行業&#xff0c;發現周圍很多朋友對薪酬問題有疑問&#xff0c;因為這種不解&#xff0c;導致經常帶情緒&#xff0c;對工作、生活很…

ipv4到ipv6的過渡

v雙協議站&#xff1a;過渡時期&#xff0c;站點必須同時支持IPv4和IPv6v隧道技術&#xff1a;IPv6主機之間通信必須使用IPv4的隧道v首部轉換&#xff1a;用于發送方使用IPv6&#xff0c;而接收方使用IPv4

關于爬蟲中常見的兩個網頁解析工具的分析 —— lxml / xpath 與 bs4 / BeautifulSoup...

http://www.cnblogs.com/binye-typing/p/6656595.html 讀者可能會奇怪我標題怎么理成這個鬼樣子&#xff0c;主要是單單寫 lxml 與 bs4 這兩個 py 模塊名可能并不能一下引起大眾的注意&#xff0c;一般講到網頁解析技術&#xff0c;提到的關鍵詞更多的是 BeautifulSoup 和 xpat…

java如何去掉html標簽_Java后端去掉HTML標簽獲取純文本-Fun言

今天又對我的博客首頁進行了一次版本的更新&#xff0c;使其自適應屏幕&#xff0c;獲得更好的用戶體驗&#xff0c;然后就出現點小問題&#xff0c;那就是原來的摘要是人為添加的&#xff0c;有長有短&#xff0c;對自適應屏幕有影響&#xff0c;所以我們現在是截取文章的前20…

單/雙中括號與測試條件

測試命令 tesst[]內置命令[[]]bash中的關鍵字 單中括號 格式[#express1#op#express2#] 注意&#xff1a;   其中#代表括號不能省略   不能匹配模式   變量引用應用雙引號括起&#xff0c;尤其當變量引用有空格時   與或非形式-a –o -not   常量應用單/雙引號括起  …

暗時間--平凡與優秀間的距離

每個人都希望&#xff0c;在他所從事的領域很優秀&#xff0c;那么如何才能優秀呢&#xff1f;有人做過一個研究&#xff0c;說那些優秀的音樂家&#xff0c;在他們成名之前&#xff0c;已經訓練過10000小時。有人可能成功得早&#xff0c;如莫扎特16歲&#xff0c;有些可能需要…