ASP.NET MVC Action向視圖傳值之匿名類型

在使用ASP.NET MVC過程中想必大家都有遇到過一個問題就是我們的Action如何向視圖傳遞匿名類型的值呢,如果不做特殊處理則無法實現。

接下來我們來看一個示例:

在我們的控制中:

using System.Collections.Generic;
using System.Web.Mvc;namespace TianYa.DotNetShare.MvcDemo.Controllers
{public class DemoController : Controller{// GET: Demopublic ActionResult Index(){var listStu = new List<dynamic>{new{SNo="1000",Name = "張三",Sex = "",Age =20},new{SNo="1001",Name = "李四",Sex = "",Age =21}};var stu = new{SNo = "1002",Name = "錢七七",Sex = "",Age = 20};ViewBag.stu = stu;ViewBag.listStu = listStu;return View();}}
}

在我們的視圖中:

@{Layout = null;
}<!DOCTYPE html><html>
<head><meta name="viewport" content="width=device-width" /><title>Index</title>
</head>
<body><div>@foreach (var item in ViewBag.listStu){<p>學號:@(item.SNo),姓名:@(item.Name),性別:@(item.Sex),年齡:@(item.Age)。</p>}<p>學號:@(ViewBag.stu.SNo),姓名:@(ViewBag.stu.Name),性別:@(ViewBag.stu.Sex),年齡:@(ViewBag.stu.Age)。</p></div>
</body>
</html>

然后將網站部署到我們的IIS上面,接下來來訪問一下我們的/demo/index

可以發現報錯了,說明傳值失敗了,那么接下來我們來簡單介紹下如何解決這個問題。

首先添加一個擴展方法幫助類:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Dynamic;
using System.Linq;
using System.Xml;namespace TianYa.DotNetShare.CommTool
{/// <summary>/// 擴展方法/// </summary>public static class ExtentMethod{#region 匿名對象處理#region 將對象[主要是匿名對象]轉換為dynamic/// <summary>/// 將對象[主要是匿名對象]轉換為dynamic/// </summary>public static dynamic ToDynamic(this object value){IDictionary<string, object> expando = new ExpandoObject();var type = value.GetType();var properties = TypeDescriptor.GetProperties(type);foreach (PropertyDescriptor property in properties){var val = property.GetValue(value);if (property.PropertyType.FullName.StartsWith("<>f__AnonymousType")){dynamic dval = val.ToDynamic();expando.Add(property.Name, dval);}else{expando.Add(property.Name, val);}}return expando as ExpandoObject;}#endregion#region 將對象[主要是匿名對象]轉換為List<dynamic>/// <summary>/// 將對象[主要是匿名對象]轉換為List<dynamic>/// </summary>public static List<dynamic> ToDynamicList(this IEnumerable<dynamic> values){var list = new List<dynamic>();if (values != null){if (values.Any()){list.AddRange(values.Select(v => ((object)v).ToDynamic()));}}return list;}#endregion#region 將匿名對象集合轉換為XML/// <summary>/// 將匿名對象集合轉換為XML/// </summary>public static XmlDocument ListObjertToXML(this IEnumerable<dynamic> values){var xmlDoc = new XmlDocument();var xmlElem = xmlDoc.CreateElement("DocumentElement");xmlDoc.AppendChild(xmlElem);if (values != null){if (values.Any()){var node = xmlDoc.SelectSingleNode("DocumentElement");foreach (var item in values){var xmlRow = xmlDoc.CreateElement("Row");ObjectToXML(item, xmlDoc, xmlRow);node.AppendChild(xmlRow);}}}return xmlDoc;}#endregion#region 將匿名對象填充XML節點/// <summary>/// 將匿名對象填充XML節點/// </summary>private static void ObjectToXML(object value, XmlDocument xmlDoc, XmlElement xmlRow){IDictionary<string, object> expando = new ExpandoObject();var type = value.GetType();var properties = TypeDescriptor.GetProperties(type);foreach (PropertyDescriptor property in properties){var val = property.GetValue(value);xmlRow.CloneNode(false);var xmlTemp = xmlDoc.CreateElement(property.Name);XmlText xmlText;if (property.PropertyType.FullName.StartsWith("<>f__AnonymousType")){dynamic dval = val.ToDynamic();xmlText = xmlDoc.CreateTextNode(dval.ObjectToString());}else{xmlText = xmlDoc.CreateTextNode(val.ToString());}xmlTemp.AppendChild(xmlText);xmlRow.AppendChild(xmlTemp);}}#endregion#endregion}
}

然后對我們的控制器做一些調整,增加調用我們的擴展方法:

using System.Collections.Generic;
using System.Web.Mvc;using TianYa.DotNetShare.CommTool;namespace TianYa.DotNetShare.MvcDemo.Controllers
{public class DemoController : Controller{// GET: Demopublic ActionResult Index(){var listStu = new List<dynamic>{new{SNo="1000",Name = "張三",Sex = "",Age =20},new{SNo="1001",Name = "李四",Sex = "",Age =21}};var stu = new{SNo = "1002",Name = "錢七七",Sex = "",Age = 20};ViewBag.stu = stu.ToDynamic();ViewBag.listStu = listStu.ToDynamicList();return View();}}
}

處理完后再來訪問一下我們的/demo/index

可以看出正常顯示了,說明我們的傳值成功了。

至此,本章就介紹完了,如果你覺得這篇文章對你有所幫助請記得點贊哦,謝謝!!!

demo源碼:

鏈接:https://pan.baidu.com/s/1_EXtKKYBYBFpBf5aDT4ASw 
提取碼:atem

?

版權聲明:如有雷同純屬巧合,如有侵權請及時聯系本人修改,謝謝!!!

轉載于:https://www.cnblogs.com/xyh9039/p/11348684.html

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

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

相關文章

2015倫敦深度學習峰會筆記(轉載)

摘要&#xff1a;在倫敦舉行的第三屆深度學習峰會由RE.WORK主辦&#xff0c;匯集了從工業領域到學術領域不同背景的專業人士&#xff0c;本文是該峰會第一天的筆記。包括Koray Kavukcuoglu、Sander Dieleman等知名深度學習專家分享了自己的經驗。上周&#xff0c;我有機會參加在…

[webrtc] rtcp模塊中rtt時間計算

RTT指 round-trip time&#xff0c;即計算AB兩端的往返時延 這里可以分成兩個問題&#xff1a; 如何在A端估算A和B之間的RTT時間? 如何在B端估算A和B之間的RTT時間? 本文參考資料:rfc 3550rfc 3611webrtc issue https://code.google.com/p/webrtc/issues/detail?id1613以及解…

Deep learning Reading List

本文轉自&#xff1a; http://jmozah.github.io/links/ http://www.datakit.cn/blog/2014/12/31/Deep_learning_Reading_List.html 文章來自J Mohamed Zahoor的深度學習閱讀書單。 Following is a growing list of some of the materials i found on the web for Deep Learning…

商戶網站使用第三方支付的大致原理和實現

如果把商戶網站使用第三方支付平臺(比如支付寶)的原理搞清楚&#xff0c;那編程就變得簡單多了。 整個過程大致這樣&#xff1a; 1、商戶與支付寶簽約。2、在商戶網站購買商品&#xff0c;填寫數量&#xff0c;確定購買后跳轉到結賬頁面。結賬頁面可能包括訂單號、定單狀態(已支…

Awesome Deep Vision

本文轉自&#xff1a;https://github.com/kjw0612/awesome-deep-vision http://jiwonkim.org/awesome-deep-vision/ A curated list of deep learning resources for computer vision, inspired by awesome-php and awesome-computer-vision. Maintainers - Jiwon Kim, Heesoo …

GitHub 新出的 Actions 是什么? 用他做自動測試?

體驗分享 本文一個嘗鮮的體驗分享, 并沒有太復雜的技巧, 做了一個最少代碼的例子展示, 讓每個人都可以把action用起來, 如果路過的大牛有高級技巧請留言分享, 我會補充. 下面正文開始. 是什么? 是一個免費的操作系統容器(Linux/Windows/macOS), 我們可以讓他預裝開發環境(node…

caffe框架翻譯-理解(轉載)

本文轉自&#xff1a; http://dirlt.com/caffe.html http://blog.csdn.net/songyu0120/article/details/468170851 caffe http://caffe.berkeleyvision.org/ 1.1 setup 安裝需要下面這些組件。這些組件都可以通過apt-get獲得。 libgoogle-glog-dev # gloglibgflags-dev # gfla…

賈揚清分享_深度學習框架caffe

本文轉自&#xff1a; http://www.datakit.cn/blog/2015/06/12/online_meet_up_with_yangqing_jia.html http://www.ifight.me/187/ Caffe是一個清晰而高效的深度學習框架&#xff0c;其作者是博士畢業于UC Berkeley的 賈揚清&#xff0c;目前在Google工作。本文是根據機器學習…

iOS多線程理解

在iOS開發中&#xff0c;線程的創建與管理已經被Apple進行了很好的封裝&#xff0c;但是在開發者實際開發中會濫用GCD,導致整個代碼混亂不堪&#xff0c;因此在這里需要對iOS開發中的多線程開發進行整理。 1. 主線程完成耗時操作&#xff0c;會導致UI卡頓&#xff0c;因此耗時…

Java生鮮電商平臺-SpringCloud微服務架構中分布式事務解決方案

Java生鮮電商平臺-SpringCloud微服務架構中分布式事務解決方案 說明&#xff1a;Java生鮮電商平臺中由于采用了微服務架構進行業務的處理&#xff0c;買家&#xff0c;賣家&#xff0c;配送&#xff0c;銷售&#xff0c;供應商等進行服務化&#xff0c;但是不可避免存在分布式事…

批量提取 caffe 特征 (python, C++, Matlab)(待續)

本文參考如下&#xff1a; Instant Recognition with Caffe Extracting Features Caffe Python特征提取 caffe 練習4 —-利用python批量抽取caffe計算得到的特征——by 香蕉麥樂迪 caffe 練習3 用caffe提供的C函數批量抽取圖像特征——by 香蕉麥樂迪 caffe python批量抽…

iOS單例初步理解

iOS單例初步理解 在iOS開發中&#xff0c;系統自帶的框架中使用了很多單例&#xff0c;非常方便用戶&#xff08;開發者&#xff0c;使用比如[NSApplication sharedApplication] 等&#xff09;&#xff0c;在實際的開發中&#xff0c;有時候也需要設計單例對象&#xff0c;為…

python面向對象之類的成員

面向對象之類的成員 細分類的組成成員 類大致分為兩塊區域&#xff1a; 第一部分&#xff1a;靜態字段 第二部分&#xff1a;動態方法 class Animal:type_name "動物類" # 靜態變量&#xff08;靜態字段&#xff09;__feature "活的" # 私有靜態變量…

python元類、反射及雙線方法

元類、反射及雙線方法 元類 print(type(abc)) print(type(True)) print(type(100)) print(type([1, 2, 3])) print(type({name: 太白金星})) print(type((1,2,3))) print(type(object))class A:passprint(isinstance(object,type)) print(isinstance(A, type)) type元類是獲取該…

iOS中的多線程一般使用場景

在IOS開發中為提高程序的運行效率會將比較耗時的操作放在子線程中執行&#xff0c;iOS系統進程默認啟動一個主線程&#xff0c;用來響應用戶的手勢操作以及UI刷新&#xff0c;因此主線程又叫做UI線程。 前面的Blog說明了NSThread以及GCD處理并發線程以及線程安全&#xff08;線…

iOS中如何優化Cell中圖片的下載性能

在iOS開發中使用最為常見的是UITableView&#xff0c;其中UITabelViewCell中下載圖片&#xff0c;會影響用戶下拉刷新UI,導致卡頓&#xff0c;用戶體驗不好&#xff0c;在這篇blog中&#xff0c;我將以一個例子來說明如何優化UITableView下載圖片 1.使用懶加載方式&#xff0c…

【Yoshua Bengio 親自解答】機器學習 81 個問題及答案(最全收錄)

本文轉自&#xff1a;http://mp.weixin.qq.com/s?__bizMzI3MTA0MTk1MA&mid401958262&idx1&sn707f228cf5779a31f0933af903516ba6&scene1&srcid0121zzdeFPtgoRoEviZ3LZDG#rd 譯者&#xff1a;張巨巖 王婉婷 李宏菲 戴秋池 這是 Quora 的最新節目&#xf…

Java生鮮電商平臺-SpringCloud微服務架構中網絡請求性能優化與源碼解析

Java生鮮電商平臺-SpringCloud微服務架構中網絡請求性能優化與源碼解析 說明&#xff1a;Java生鮮電商平臺中&#xff0c;由于服務進行了拆分&#xff0c;很多的業務服務導致了請求的網絡延遲與性能消耗&#xff0c;對應的這些問題&#xff0c;我們應該如何進行網絡請求的優化與…

XCode7 創建framework

1.新建一個靜態庫工程. file→ new→ project, 彈出框中選擇iOS→ framework & library中的cocoa touch static library.點擊Next,輸入product name: TestFramework, 點擊Next→ 點擊Create. 2.刪除向導所生成工程中的Target. 點擊工程名→ 點擊TARGETS → 右鍵Delete. …

基礎js逆向練習-登錄密碼破解(js逆向)

練習平臺&#xff1a;逆向賬號密碼 https://login1.scrape.center/ 直接打開平臺&#xff0c;輸入密碼賬號&#xff0c;抓包找到加密的參數攜帶的位置&#xff0c;這邊我們找到的是一個叫token的加密參數&#xff0c;這個參數的攜帶是一個密文 我們首先考慮一下搜索這個加密的…