在使用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

ASP.NET MVC Action向视图传值之匿名类型相关推荐

  1. Action向视图传值的6种方式

    在使用ASP.NET MVC进行项目开发时,经常会碰到从Action向视图传值的问题,今天我就把我所知道的方式总结了一下,分成了以下六种: 1.使用ViewData进行传值 在Action中,有如下代 ...

  2. ASP.NET MVC Action Filters

    在看这篇Fun with Http Headers in ASP.NET MVC Action Filters的时候,提到了 Roni Schuetz在codeplex上创建的一个项目ASP.NET ...

  3. ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式

    准备 在Models文件夹里面新添加Student实体类,用来模拟从Controller向View传递数据,Student类定义如下: using System; using System.Colle ...

  4. Asp.net MVC Action大全(转)

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  5. 第二章 ASP.NET MVC (视图传值到控制器)

    一.当需要从视图文件传值到控制器中,可以使用Request对象来完成,它是最原始的视图和后台之间的数据传递方式 二.[HttpPost]是一种注解语法,有这个语法的方法,表示该方法是Post提交方式才 ...

  6. Asp.net Mvc视频教程 页面传值基础(get/post/UpdateModel)

    今天录了这三个,感觉质量稍差,讲的还算明白. 如有不详,还是请大家直说,立做补充 这三集主要讲了QueryString.表单及获取整个对象的UpdateModel http://v.youku.com ...

  7. 理解ASP.NET MVC Framework Action Filters(翻的)

    原文地址:Understanding Action Filters 本指南主要解释action filters,action filter作为一个可以应用到controller action(或者是整 ...

  8. ASP.NET MVC XML绑定Action参数列表

    昨天查看了 ASP.NET MVC 的生命周期,并没有找到类似的解决方案. 不过今天在 stackoverflow上找到了解决方案,没耐心的同学可以直接戳原文拷贝代码,原文地址:How to pass ...

  9. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

    本系列文章基于ASP.NET MVC Preview5. 前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继 ...

最新文章

  1. linux 安装 MySQL
  2. 时序数据采样、原始循环神经网络RNN、RNN梯度爆炸原因推导
  3. bootstrap_bootstrap中日历范围选择插件daterangepicker的使用
  4. 关于SOCKET资源堆栈
  5. 我的第一份工作 (2007.2.28--2008.2.28) 上海三高计算机中心有限公司
  6. 控制面板项 .cpl 文件说明
  7. java 方法参数绑定_java在注解中绑定方法参数的解决方案
  8. 【原创】基于NIOS II的ADS1256 SPI驱动
  9. Android自定义控件之app标题栏的封装
  10. Docker教程小白实操入门(10)--如何删除一个镜像
  11. Java开发人员简历做假的常见情况
  12. 如何在CAD图纸中添加文字
  13. 足球大数据预测胜平负、走地之人工智能算法现状与改进措施
  14. 手机网页制作的认识(有关meta标签)
  15. 新塘单片机烧写器_新唐单片机烧录工具-Nuvoton ICP Programming Tool下载v3.00.6909官方免费版-ucbug下载站...
  16. flv转换mp4最简单方法
  17. leetcode报错reached end of file while parsing
  18. vue 商城浏览足迹_vue 移动端记录页面浏览位置的方法
  19. Spring 项目中applicationContext.xml模板
  20. RecyclerView EditText数据混乱解决

热门文章

  1. 奇小葩讲设备树(5/5)-- Linux设备树详解(五)设备树的使用
  2. ROS2学习(六).ROS概念 - 服务质量设置
  3. matlab中方差直方图,如何规范直方图在MATLAB?
  4. asp将新闻内容写入mysql数库据_在ASP.net中保存/取出图片入/从SQL数据库
  5. java package报错_Java从入门到精通(一)
  6. 深度学习(23)随机梯度下降一: 随机梯度下降简介
  7. hadoop设置ssh免密码登录
  8. TCP/IP详解笔记----第一章:概述
  9. makefile如何减小可执行文件的大小(没有用到的函数不参与链接)
  10. 太监式的自主知识产权研发特色 (Z)