马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

ASP.NET MVC Action向视图传值之匿名类型

[复制链接]
查看2324 | 回复0 | 2019-8-13 22:30:10 | 显示全部楼层 |阅读模式

在利用ASP.NET MVC过程中想必大家都有遇到过一个问题就是我们的Action如何向视图传递匿名范例的值呢,如果不做特殊处理则无法实现。

接下来我们来看一个示例:

在我们的控制中:

  1. using System.Collections.Generic;
  2. using System.Web.Mvc;
  3. namespace TianYa.DotNetShare.MvcDemo.Controllers
  4. {
  5. public class DemoController : Controller
  6. {
  7. // GET: Demo
  8. public ActionResult Index()
  9. {
  10. var listStu = new List<dynamic>
  11. {
  12. new
  13. {
  14. SNo="1000",
  15. Name = "张三",
  16. Sex = "男",
  17. Age =20
  18. },
  19. new
  20. {
  21. SNo="1001",
  22. Name = "李四",
  23. Sex = "男",
  24. Age =21
  25. }
  26. };
  27. var stu = new
  28. {
  29. SNo = "1002",
  30. Name = "钱七七",
  31. Sex = "女",
  32. Age = 20
  33. };
  34. ViewBag.stu = stu;
  35. ViewBag.listStu = listStu;
  36. return View();
  37. }
  38. }
  39. }
复制代码

在我们的视图中:

  1. @{
  2. Layout = null;
  3. }
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta name="viewport" content="width=device-width" />
  8. <title>Index</title>
  9. </head>
  10. <body>
  11. <div>
  12. @foreach (var item in ViewBag.listStu)
  13. {
  14. <p>学号:@(item.SNo),姓名:@(item.Name),性别:@(item.Sex),年事:@(item.Age)。</p>
  15. }
  16. <p>
  17. 学号:@(ViewBag.stu.SNo),姓名:@(ViewBag.stu.Name),性别:@(ViewBag.stu.Sex),年事:@(ViewBag.stu.Age)。
  18. </p>
  19. </div>
  20. </body>
  21. </html>
复制代码

然后将网站部署到我们的IIS上面,接下来来访问一下我们的/demo/index

223503elqtb9p9u80nlqnn.png

可以发现报错了,说明传值失败了,那么接下来我们来简单介绍下如何解决这个问题。

首先添加一个扩展方法帮助类:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Dynamic;
  5. using System.Linq;
  6. using System.Xml;
  7. namespace TianYa.DotNetShare.CommTool
  8. {
  9. /// <summary>
  10. /// 扩展方法
  11. /// </summary>
  12. public static class ExtentMethod
  13. {
  14. #region 匿名对象处理
  15. #region 将对象[重要是匿名对象]转换为dynamic
  16. /// <summary>
  17. /// 将对象[重要是匿名对象]转换为dynamic
  18. /// </summary>
  19. public static dynamic ToDynamic(this object value)
  20. {
  21. IDictionary<string, object> expando = new ExpandoObject();
  22. var type = value.GetType();
  23. var properties = TypeDescriptor.GetProperties(type);
  24. foreach (PropertyDescriptor property in properties)
  25. {
  26. var val = property.GetValue(value);
  27. if (property.PropertyType.FullName.StartsWith("<>f__AnonymousType"))
  28. {
  29. dynamic dval = val.ToDynamic();
  30. expando.Add(property.Name, dval);
  31. }
  32. else
  33. {
  34. expando.Add(property.Name, val);
  35. }
  36. }
  37. return expando as ExpandoObject;
  38. }
  39. #endregion
  40. #region 将对象[重要是匿名对象]转换为List<dynamic>
  41. /// <summary>
  42. /// 将对象[重要是匿名对象]转换为List<dynamic>
  43. /// </summary>
  44. public static List<dynamic> ToDynamicList(this IEnumerable<dynamic> values)
  45. {
  46. var list = new List<dynamic>();
  47. if (values != null)
  48. {
  49. if (values.Any())
  50. {
  51. list.AddRange(values.Select(v => ((object)v).ToDynamic()));
  52. }
  53. }
  54. return list;
  55. }
  56. #endregion
  57. #region 将匿名对象集合转换为XML
  58. /// <summary>
  59. /// 将匿名对象集合转换为XML
  60. /// </summary>
  61. public static XmlDocument ListObjertToXML(this IEnumerable<dynamic> values)
  62. {
  63. var xmlDoc = new XmlDocument();
  64. var xmlElem = xmlDoc.CreateElement("DocumentElement");
  65. xmlDoc.AppendChild(xmlElem);
  66. if (values != null)
  67. {
  68. if (values.Any())
  69. {
  70. var node = xmlDoc.SelectSingleNode("DocumentElement");
  71. foreach (var item in values)
  72. {
  73. var xmlRow = xmlDoc.CreateElement("Row");
  74. ObjectToXML(item, xmlDoc, xmlRow);
  75. node.AppendChild(xmlRow);
  76. }
  77. }
  78. }
  79. return xmlDoc;
  80. }
  81. #endregion
  82. #region 将匿名对象添补XML节点
  83. /// <summary>
  84. /// 将匿名对象添补XML节点
  85. /// </summary>
  86. private static void ObjectToXML(object value, XmlDocument xmlDoc, XmlElement xmlRow)
  87. {
  88. IDictionary<string, object> expando = new ExpandoObject();
  89. var type = value.GetType();
  90. var properties = TypeDescriptor.GetProperties(type);
  91. foreach (PropertyDescriptor property in properties)
  92. {
  93. var val = property.GetValue(value);
  94. xmlRow.CloneNode(false);
  95. var xmlTemp = xmlDoc.CreateElement(property.Name);
  96. XmlText xmlText;
  97. if (property.PropertyType.FullName.StartsWith("<>f__AnonymousType"))
  98. {
  99. dynamic dval = val.ToDynamic();
  100. xmlText = xmlDoc.CreateTextNode(dval.ObjectToString());
  101. }
  102. else
  103. {
  104. xmlText = xmlDoc.CreateTextNode(val.ToString());
  105. }
  106. xmlTemp.AppendChild(xmlText);
  107. xmlRow.AppendChild(xmlTemp);
  108. }
  109. }
  110. #endregion
  111. #endregion
  112. }
  113. }
复制代码

然后对我们的控制器做一些调整,增加调用我们的扩展方法:

  1. using System.Collections.Generic;
  2. using System.Web.Mvc;
  3. using TianYa.DotNetShare.CommTool;
  4. namespace TianYa.DotNetShare.MvcDemo.Controllers
  5. {
  6. public class DemoController : Controller
  7. {
  8. // GET: Demo
  9. public ActionResult Index()
  10. {
  11. var listStu = new List<dynamic>
  12. {
  13. new
  14. {
  15. SNo="1000",
  16. Name = "张三",
  17. Sex = "男",
  18. Age =20
  19. },
  20. new
  21. {
  22. SNo="1001",
  23. Name = "李四",
  24. Sex = "男",
  25. Age =21
  26. }
  27. };
  28. var stu = new
  29. {
  30. SNo = "1002",
  31. Name = "钱七七",
  32. Sex = "女",
  33. Age = 20
  34. };
  35. ViewBag.stu = stu.ToDynamic();
  36. ViewBag.listStu = listStu.ToDynamicList();
  37. return View();
  38. }
  39. }
  40. }
复制代码

处理完后再来访问一下我们的/demo/index

223504ue36ereep5k160ep.png

可以看出正常显示了,说明我们的传值成功了。

至此,本章就介绍完了,如果你觉得这篇文章对你有所帮助请记得点赞哦,谢谢!!!

demo源码:

  1. 链接:https://pan.baidu.com/s/1_EXtKKYBYBFpBf5aDT4ASw
  2. 提取码:atem
复制代码

版权声明:如有雷同纯属巧合,如有侵权请及时接洽本人修改,谢谢!!!


来源:https://www.cnblogs.com/xyh9039/p/11348684.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则