关于匿名类无法转换为object
缘由,不能在Razor中使用匿名类,
先事先封装了一个方法,用于Razor给cshtml模板返回页面。

在ashx一般处理程序中,是这样调用的
匿名类的格式如下:(只看格式,不看具体内容)

调用这样

报错
[TemplateCompilationException: Unable to compile template. “object”不包含“UserName”的定义,并且找不到可接受类型为“object”的第一个参数的扩展方法“UserName”(是否缺少 using 指令或程序集引用?)

分析原因如下:
因为匿名类是internal的,razor的原理是将模板(混合html和@{c#代码})生成.net类,这样肯定就不能用internal的类,(razor的dll程序集跟匿名类肯定不在一个程序集)只能用public类。
(参考文件:
1 http://blog.csdn.net/lxy1106/article/details/50803626
2 http://blog.csdn.net/xcl13014673050/article/details/46816817
)
参考原理如下:

解决方法
1.不使用匿名类,在Model中声明一个新的public类,来存储需要的字段属性。
2.使用匿名类,使用Newtonsoft.Json 9.0.1 (https://github.com/JamesNK/Newtonsoft.Json/releases/tag/9.0.1)
首先,加载newtonsoft.json.dll,然后添加引用。
然后,添加方法如下
/// <summary>
/// 将匿名类转换为public
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static dynamic ToDynamicObject(object obj)
{ string json = JsonConvert.SerializeObject(obj); //将匿名类转换为字符串 dynamic dynamicObj = JsonConvert.DeserializeObject(json);//将字符串转换为object,此时为public return dynamicObj; }
更改ashx中的代码

但是注意!!!!这样,在cshtml拿到的model就是一个dynamic的集合,因此要用foreach遍历,不再是强类型的了,所以cshtml代码如下

这样就能完成匿名类在razor中的调用,虽然功能能完成,但是这样并不是很好。最好还是使用第一种方法,在Model中建一个类。
追加::
对于
这种情况就能执行的原因。(不也是匿名类吗?)
因为这样写没有用到dynamic去读取属性的值,而是模板使用反射读取的,反射是可以读取internal成员的,但是一旦放到集合中或者有关联属性的时候,就用到dynamic了,而dyanmic是无法访问internal的
下面是在reflector中ParseRazor方法

关于匿名类无法转换为object的更多相关文章
- EF select 匿名类 问题
连续两次被相同问题困扰. 一.举例 var query=db.StudentScore.Where(r=> r.SubjectId==subjectId).Select(g=>new {S ...
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
比如有一个匿名对象,var result =......Select( a=>new { id=a.id, name=a.name});然后Object obj = result ;我怎 ...
- Linq之隐式类型、自动属性、初始化器、匿名类
目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...
- C#将类对象转换为字典
主要是实现将类里面 的属性和对应的值转换为字典的键和值. public class RDfsedfw { /// <summary> /// 将匿名类转换为字典 /// </summ ...
- 学习笔记:因为java匿名类学习到接口的一些小用法
在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧. 先看一段代码: 代码1 这段代码中有一个new的操作,而且是在方 ...
- HttpCookie加匿名类实现多语言
突然想做一个多语言网站,确不知道怎么实现好,突然想到了HttpCookie,然后页面后台用匿名类实现语言的储存. string lan = Request["str_lan"]; ...
- .net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类
在开发中可能会遇到这几种情况 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要 ...
- c# dynamic动态类型和匿名类
dynamic类型 简单示例 dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写 expando.Id = 1; e ...
- .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)
1.自动属性 Auto-Implemented Properties 2.隐式类型 var var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...
随机推荐
- v$osstat
SQL> select * from v$osstat; STAT_NAME VALUE OSSTAT_ID COMMENTS CUM ----------------------------- ...
- 当As3遇见Swift(三)
类 As3 Swift中似乎没有包,包路径的概念.因而显得简洁的多. package { public class ShuaiGe { } } Swift类 class ShuaiGe{ } 类的构造 ...
- 随机删除数据库N条记录
delete from table where newsID in(select top 50 newsID from table order by newid())
- [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Mysql存储过程总结
1. 关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.好在MySQL 5.0终于开始已经支持存储过 ...
- 夺命雷公狗ThinkPHP项目之----企业网站17之网站配置页的添加
为了网站可以智能一点,所以我们开始来写一个网站配置的功能.. 所以我来写他的数据表: 先来完成他的添加功能,页面效果如下所示: lists.html代码如下所示: <!doctype html& ...
- Android 屏幕滑动事件
http://blog.csdn.net/iamfafa/article/details/6316062 Android里有两个类 android.view.GestureDetector andro ...
- 给Debian安装Xfce桌面
1.sudo apt-get install xorg xdm xfce4 2.vi ~/.xinitrc,然后输入:exec xfce4,在终端输入startx命令后就能进入xfce4,或直接在 ...
- javascript中字符串格式json如何转化成json对象
什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于 ...
- Java Persistence API(转)
定义 Java Persistence API JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.[编辑本段]起源 Sun引入新的JPA ORM规范 ...