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.mzph.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;这个参数的携带是一个密文 我们首先考虑一下搜索这个加密的…