码迷,mamicode.com
首页 > 其他好文 > 详细

关于匿名类无法转换为object

时间:2016-08-19 14:51:35      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:

缘由,不能在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中建一个类。

 

关于匿名类无法转换为object

标签:

原文地址:http://www.cnblogs.com/John-Marnoon/p/5787330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!