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;我有机会参加在…

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 …

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…

Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明&#xff1a;Java生鲜电商平台中由于采用了微服务架构进行业务的处理&#xff0c;买家&#xff0c;卖家&#xff0c;配送&#xff0c;销售&#xff0c;供应商等进行服务化&#xff0c;但是不可避免存在分布式事…

【Yoshua Bengio 亲自解答】机器学习 81 个问题及答案(最全收录)

本文转自&#xff1a;http://mp.weixin.qq.com/s?__bizMzI3MTA0MTk1MA&mid401958262&idx1&sn707f228cf5779a31f0933af903516ba6&scene1&srcid0121zzdeFPtgoRoEviZ3LZDG#rd 译者&#xff1a;张巨岩 王婉婷 李宏菲 戴秋池 这是 Quora 的最新节目&#xf…

基础js逆向练习-登录密码破解(js逆向)

练习平台&#xff1a;逆向账号密码 https://login1.scrape.center/ 直接打开平台&#xff0c;输入密码账号&#xff0c;抓包找到加密的参数携带的位置&#xff0c;这边我们找到的是一个叫token的加密参数&#xff0c;这个参数的携带是一个密文 我们首先考虑一下搜索这个加密的…

python之socket

socket套接字 什么叫socket socket是处于应用层与传输层之间的抽象层,他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后,交由操作系统.socket在python中就是一个模块. socket两个分类 基于文件类型的套接字家族 套接字家族的名字&#xff1a;AF_UNIX unix一切皆文件…

socket补充:通信循环、链接循环、远程操作及黏包现象

socket补充&#xff1a;通信循环、链接循环、远程操作及黏包现象 socket通信循环 server端&#xff1a; import socketphone socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.bind((127.0.0.1,8080))phone.listen(5)conn, client_addr phone.accept() print(conn, cl…

Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理

Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理 说明&#xff1a;Java生鲜电商平台中&#xff0c;我们将进一步理解微服务架构的核心要点和实现原理&#xff0c;为读者的实践提供微服务的设计模式&#xff0c;以期让微服务在读者正在工作的项目中起到积极的作用。…

ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试

想必大家之前在进行ASP.NET Web 应用程序开发期间都有用到过将我们的网站部署到IIS自定义主机域名并附加到进程进行调试。 那我们的ASP.NET Core Web 应用程序又是如何部署到我们的IIS上面进行调试的呢&#xff0c;接下来我们来简单介绍下&#xff1a; 一、安装IIS所需的Host扩…

ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)...

在正式进入主题之前我们来看下几个概念&#xff1a; 一、依赖倒置 依赖倒置是编程五大原则之一&#xff0c;即&#xff1a; 1、上层模块不应该依赖于下层模块&#xff0c;它们共同依赖于一个抽象。 2、抽象不能依赖于具体&#xff0c;具体依赖于抽象。 其中上层就是指使用者&am…

苹果电脑基本设置+Linux 命令+Android 实战集锦

本文微信公众号「AndroidTraveler」首发。 背景 大多数应届毕业生在大学期间使用的比较多的是 windows 电脑&#xff0c;因此初入职场如果拿到一台苹果电脑&#xff0c;可能一时间不能够很快的上手。基于此&#xff0c;这边出了系列视频&#xff0c;通过实际的演示让没使用过苹…

Mac中AndroidStudio没有找到Plugins的问题

我们在windows中都可以正常找到plugins 但是在Mac上AndroidStudio里 setting打开却没有plugins 正准备在Mac上搞一下flutter呢 我感觉智商受到了侮辱&#xff01; 这里其实是mac版本给我开了个玩笑 你可以按快捷键&#xff0c;你就可以找到 快捷键 command ‘,’ 没错就是comm…

进程和操作系统概述

进程和操作系统概述 进程的基础 程序和进程&#xff1a; 程序是一对静态的代码文件 进程是一个正在运行着的程序&#xff0c;抽象概念 进程由操作系统操控调用交于CPU运行 操作系统 1.管理控制协调计算机硬件和软件的关系 2.操作系统的作用&#xff1f; ​ 第一个作用&#xff…

对前端Jenkins自动化部署的研究

1. 安装 安装 Nginx 1.1去官网下直接下载&#xff0c;解压缩 start nginx就可以使了&#xff0c;常用命令&#xff1a; start nginx # 启动 nginx -s reload # 修改配置后重新加载生效 nginx -s reopen # 重新打开日志文件 nginx -t # 配置文件检测是否正确 1.2 安装Jenkins…

ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)...

在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入&#xff0c;本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入。 PS&#xff1a;本章将主要采用构造函数注入的方式&#xff0c;下一章将继续分享如何使之能够同…

Java过滤器与SpringMVC拦截器之间的关系与区别

今天学习和认识了一下&#xff0c;过滤器和SpringMVC的拦截器的区别&#xff0c;学到了不少的东西&#xff0c;以前一直以为拦截器就是过滤器实现的&#xff0c;现在想想还真是一种错误啊&#xff0c;而且看的比较粗浅&#xff0c;没有一个全局而又细致的认识&#xff0c;由于已…

二次幂权限设计

设置含有的权限如增删改查减为1,2,4,8,16 如果A包含增删改这5个权限&#xff0c;那A的值为1247 如果B包含增改查这5个权限&#xff0c;那A的值为14813 如果C包含增删改查减这5个权限&#xff0c;那A的值为12481631 7二进制为111,13的二进制为1101,31二进制为11111 1二进制为1&a…

使用putty在linux主机和windows主机之间拷贝文件(已测试可执行)

转载于&#xff0c;请点击 首先下载putty&#xff0c;putty下载地址zip&#xff0c; 解压zip发现里面有plink.exe pscp.exe psftp.exe putty.exe puttygen.exe puttytel.exe等可执行文件&#xff0c;如果只是想要链接主机做一些操作那么使用putty.exe&#xff0c;要想要上传 …

ASP.NET Core Web 应用程序系列(三)- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)...

在上一章中主要和大家分享了在ASP.NET Core中如何使用Autofac替换自带DI进行构造函数的批量依赖注入&#xff0c;本章将和大家继续分享如何使之能够同时支持属性的批量依赖注入。 约定&#xff1a; 1、仓储层接口都以“I”开头&#xff0c;以“Repository”结尾。仓储层实现都以…