缘由,不能在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的更多相关文章

  1. EF select 匿名类 问题

    连续两次被相同问题困扰. 一.举例 var query=db.StudentScore.Where(r=> r.SubjectId==subjectId).Select(g=>new {S ...

  2. c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic

    比如有一个匿名对象,var  result =......Select( a=>new {  id=a.id, name=a.name});然后Object  obj =  result ;我怎 ...

  3. Linq之隐式类型、自动属性、初始化器、匿名类

    目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...

  4. C#将类对象转换为字典

    主要是实现将类里面 的属性和对应的值转换为字典的键和值. public class RDfsedfw { /// <summary> /// 将匿名类转换为字典 /// </summ ...

  5. 学习笔记:因为java匿名类学习到接口的一些小用法

    在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧.   先看一段代码: 代码1   这段代码中有一个new的操作,而且是在方 ...

  6. HttpCookie加匿名类实现多语言

    突然想做一个多语言网站,确不知道怎么实现好,突然想到了HttpCookie,然后页面后台用匿名类实现语言的储存. string lan = Request["str_lan"]; ...

  7. .net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类

    在开发中可能会遇到这几种情况 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要 ...

  8. c# dynamic动态类型和匿名类

    dynamic类型 简单示例 dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写 expando.Id = 1; e ...

  9. .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)

    1.自动属性 Auto-Implemented Properties 2.隐式类型 var  var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...

随机推荐

  1. 通过zabbix自带模板监控windowsPC机器

       通过zabbix自带模板监控windowsPC机器   作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.       欢迎加入:高级运维工程师之路 598432640 相信有很多 ...

  2. 最大密集子图(01分数规划+二分+最小割)POJ3155

    题意:给出一副连通图,求出一个子图令g=sigma(E)/sigma(V); h[g]=sigma(E)-g*sigma(V):设G是最优值 则当h[g]>0:g<G h[g]<0, ...

  3. fzu 2111 Min Number

      http://acm.fzu.edu.cn/problem.php?pid=2111  Problem 2111 Min Number Accept: 572    Submit: 1106Tim ...

  4. poj: 1207

    好吧这题竟然还有先大后小的可能,能不这么恶心下吗.. #include <iostream> #include <stdio.h> #include <string.h& ...

  5. Codeforces Round #313 (Div. 1) C. Gerald and Giant Chess

    这场CF又掉分了... 这题题意大概就给一个h*w的棋盘,中间有一些黑格子不能走,问只能向右或者向下走的情况下,从左上到右下有多少种方案. 开个sum数组,sum[i]表示走到第i个黑点但是不经过其他 ...

  6. 关于LED 流水灯的软件调试方法(非开发板调试)

    因为: 硬件 norflash 有寿命,所以尽量少用,而且自己也不会把 程序在 KEIL中从SDRAM 中调试,不会设置.所以采取软件虚拟的方法调试. 主要修改一下几部分: 1.  ledcircle ...

  7. Javascript中函数及变量定义的提升

    <html> <head> <title>函数提升</title> <script language="javascript" ...

  8. batch批的概念

    批处理(Batch Requests), 批处理简单理解为同时执行的一批SQL处理语句,一个批处理中可能有多个DML.多个存储过程等等.如在SSMS操作,每个'GO'执行前都属于一个批处理. 注意区分 ...

  9. zw版【转发·台湾nvp系列Delphi例程】.NET调用HALCON COM控件内存释放模式

    zw版[转发·台湾nvp系列Delphi例程].NET调用HALCON COM控件内存释放模式 ------------------------------------方法一 :Imports Sys ...

  10. JavaScript的函数和事件(转)

    一.默认函数 JavaScript提供了一些默认的函数 编码函数escape():将非字母.数字字符转换成ASCII码 译码函数unescape():将ASCII码转换成字母.数字字符 求值函数eva ...