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

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

在我们的控制中:

using System.Collections.Generic;
using System.Web.Mvc; namespace TianYa.DotNetShare.MvcDemo.Controllers
{
public class DemoController : Controller
{
// GET: Demo
public ActionResult Index()
{
var listStu = new List<dynamic>
{
new
{
SNo="",
Name = "张三",
Sex = "男",
Age =
},
new
{
SNo="",
Name = "李四",
Sex = "男",
Age =
}
};
var stu = new
{
SNo = "",
Name = "钱七七",
Sex = "女",
Age =
};
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: Demo
public ActionResult Index()
{
var listStu = new List<dynamic>
{
new
{
SNo="",
Name = "张三",
Sex = "男",
Age =
},
new
{
SNo="",
Name = "李四",
Sex = "男",
Age =
}
};
var stu = new
{
SNo = "",
Name = "钱七七",
Sex = "女",
Age =
};
ViewBag.stu = stu.ToDynamic();
ViewBag.listStu = listStu.ToDynamicList(); return View();
}
}
}

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

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

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

demo源码:

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

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

ASP.NET MVC Action向视图传值之匿名类型的更多相关文章

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

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

  2. Action向视图传值的6种方式(转)

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

  3. ASP.NET MVC : Action过滤器(Filtering)

    http://www.cnblogs.com/QLeelulu/archive/2008/03/21/1117092.html ASP.NET MVC : Action过滤器(Filtering) 相 ...

  4. Asp.Net MVC以 JSON传值扩展方法

    Asp.Net在客户端和服务器端,以JSON形式相互传值,可写扩展方法,用到的类型如下: DataContractJsonSerializer类: 该类在System.Runtime.Serializ ...

  5. Asp.Net MVC以JSON传值扩展方法

    Asp.Net在客户端和服务器端,以JSON形式相互传值,可写扩展方法,用到的类型如下: DataContractJsonSerializer类: 该类在System.Runtime.Serializ ...

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

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

  7. ASP.NET MVC Action返回结果类型【转】

    ASP.NET MVC 目前一共提供了以下几种Action返回结果类型: 1.ActionResult(base) 2.ContentResult 3.EmptyResult 4.HttpUnauth ...

  8. HTTP Modules versus ASP.NET MVC Action Filters

    from:http://odetocode.com/blogs/scott/archive/2011/01/17/http-modules-versus-asp-net-mvc-action-filt ...

  9. ASP.Net MVC Action重定向跳出Controller和Area

    1.重定向方法简介 [HttpPost] public ActionResult StudentList( string StudName, string studName, DateTime Bir ...

随机推荐

  1. js简单动画:匀速动画、缓动动画、多物体动画以及透明度动画

    主要实现以下几种简单的动画效果(其实原理基本相同): 1.匀速动画:物体的速度固定 2.缓动动画:物体速度逐渐变慢 3.多物体动画 4.透明度动画 效果实现: 1.匀速动画(以物体左右匀速运动为例) ...

  2. CSS 选择器、字体/文本、背景

    CSS的基本使用 直接写在标签内 <p style="color: red; font-size: 40px;">段落</p> 写在 style 标签内 & ...

  3. SAP MM ME57界面看到的供应源跟Source List主数据不一致?

    SAP MM ME57界面看到的供应源跟Source List主数据不一致? ME57,为如下的PR单据分配供应源, 发现找不到想要分配的供应源. ME03 去看Source List主数据, 黄色标 ...

  4. SQLserver还原失败(数据库正在使用,无法获得对数据库的独占访问权)

    问题描述: Sql server还原失败(数据库正在使用,无法获得对数据库的独占访问权) 数据库还原的时候还有其他进程连在上面,导致无法获得独占造成的. 这个问题的原因在于有用户连接了当前要做还原的数 ...

  5. MySql数据库基础之数据库简介及安装

    MySql数据库简介: 众所周知,MySql数据库是一款开源的关系型数据库,在Web应用方面,MySql是最好的.最流行的RDBMS(Relational Database Management Sy ...

  6. python函数编程-装饰器decorator

    函数是个对象,并且可以赋值给一个变量,通过变量也能调用该函数: >>> def now(): ... print('2017-12-28') ... >>> l = ...

  7. .net core 2.1 Nlog.Web.AspNetCore Nlog日志

    1.先创建 .net core Web 应用程序,选择API 2.安装 Nuget 包:Nlog.Web.AspNetCore install-package Nlog install-package ...

  8. golang的缓冲channel简单使用

    目录 golang的缓冲channel简单使用 阻塞型 非阻塞 golang的缓冲channel简单使用 我们常用的是无缓冲channel : make(chan type) 其实make() 创建c ...

  9. How to: Apply Attributes to Entity Properties when Using Model First 如何:在ModelFirst时将属性应用于实体属性

    In a Model First data model, object properties are declared in the designer-generated files, and you ...

  10. css里的背景属性有哪些,如何去使用哪些属性

    分类:纯色背景    背景图像 1.背景颜色 background-color : 任意合法的颜色 和 transparent 2.背景图像 background-image : url(想要加载的图 ...