zoukankan      html  css  js  c++  java
  • 关于匿名类无法转换为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方法 

  • 相关阅读:
    #敏捷个人# 每日成长101:第72天【自我接纳】
    如何从敏捷个人架构图看出时间管理的演变
    #敏捷个人# 每日成长101:第73天【选择】
    2012年度总结:内心宁静的2012
    欢迎关注敏捷个人微信公众帐号
    敏捷个人的创立与详解Scrum会议
    学习敏捷个人卡片V1.0
    #敏捷个人# 每日认识101(11):做自己的医生
    #敏捷个人# 面向对象分析与PPT有什么关系?
    《敏捷个人-认识自我,管理自我 v0.6.pdf》配套PPT打印书籍
  • 原文地址:https://www.cnblogs.com/John-Marnoon/p/5787330.html
Copyright © 2011-2022 走看看