ASP.NET MVC3 + Entity Framework项目中,从控制器传递匿名对象到视图非常常见,原本以为用dynamic能轻松搞定,最后发现我错了:

Controller:

 代码如下 复制代码

public ActionResult Index()
{
    testContext context = new testContext();
    dynamic data = context.People
        .Join(context.Pets, person => person.Id, Pet => Pet.Pid, (person, pet) => new { Person = person.Name, Pet = pet.Name });
    return View(data);
}

View:

@model dynamic

@foreach(var item in Model)
{
    @(item.Person)<text>,</text>@(item.Pet)<br />
}

其原因是C#的编译器总是将匿名类型编译成internal的,当通过dynamic访问在当前上下文不可见的成员的时候,就会引发异常。问题重现:

 代码如下 复制代码

using System;
using System.Collections.Generic;
using System.Linq;

namespace Controller
{
    public class Test
    {
        /// <summary>
        /// 模拟匿名对象匿名类
        /// </summary>
        private class Anonymous
        {
            public string Person { get; set; }
            public string Pet { get; set; }
        }

public dynamic GetValue()
        {
            return new Anonymous();
        }
    }
}

namespace View
{
    using Controller;

class Program
    {
        static void Main(string[] args)
        {
            dynamic anonymous = new Test().GetValue();
            Console.WriteLine(anonymous.Person);

Console.ReadKey();
        }
    }
}

以前都用老赵的ToDynamic方法解决,今天在.NET 4.0的System命名空间下看到一个类Tuple,了解后发现用它也可以解决上边的问题:

Controller:

 代码如下 复制代码

public ActionResult Index()
{
    testContext context = new testContext();
    dynamic data = context.People
        .Join(context.Pets, person => person.Id, Pet => Pet.Pid, (person, pet) => new { Person = person.Name, Pet = pet.Name })
        .ToList().Select(item => Tuple.Create(item.Person, item.Pet));
    return View(data);
}

View:

@model IEnumerable<Tuple<string, string>>

@foreach(var item in Model)
{
    @(item.Item1)<text>,</text>@(item.Item2)<br />
}

ASP.NET MVC3控制器传递匿名对象到视图实例的更多相关文章

  1. 关于mvc中传递匿名对象,view中无法解析

    最近做项目用到MVC,发现用linq查询得到的数据是匿名类型对象,通过模型绑定.或者ViewBag.ViewData进行数据传递后,View解析报错:“object 未包含xx的定义”: 没找到好的解 ...

  2. MVC 控制器中传递dynamic(对象) 给视图

    有时候不想重新定义一个实体,则使用 dynamic 来定义匿名类型. //匿名类型 传递到前台 Model dynamic viewModel = new { UserID = 5016 }; ret ...

  3. mvc 传递匿名对象

    Controller代码: public ActionResult TupleTest() { LinqDBEntities db = new LinqDBEntities(); dynamic da ...

  4. PHP Lavavel 使用控制器 传递变量 以及调用 视图模板

    控制器第一次入门使用 位置: 在app/Http/Controllers 目录下创建文件名格式:例如 UserController路由调用格式:Route::get('user/tom','UserC ...

  5. 经典ASP.NET MVC3.0入门详解

    http://blog.csdn.net/csh624366188/article/details/7064269 :由于本文原在word文档里编写,写本文章时运用了大量截图,直接复制到博客里,没有显 ...

  6. dynamic与匿名对象

    用dynamic接收匿名对象很方便,因为不需要去定义model了,但是也有一个弊端,就是匿名对象的作用范围是internal的,也就是只能存在于当前程序域,所以用dynimic跨程序域去接收一个匿名对 ...

  7. Java匿名对象和匿名类总结

    一.匿名对象 匿名对象是没有名字的实体,也就是该实体没有对应的变量名引用  匿名对象的特征:            创建的匿名类的对象只能够调用一次            匿名对象只在堆内存中开辟空间 ...

  8. Tuple解决在视图中通过razor获取控制器传递给视图的匿名对象的报错问题

    C#的编译器总是将匿名类型编译成internal的,当在视图中直接使用控制器传递的匿名对象时就会报错错误代码:控制器代码视图代码执行结果: ****************************** ...

  9. ASP.NET MVC3入门教程之参数(数据)传递

    本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=98&extra=page%3D1 MVC模式的参数(数据)传递 ...

随机推荐

  1. Android Studio OkHttpClient使用

    本次来记录下OkHttpClient的使用,OkHttpClient是用来完成android 客户端对服务端请求的工具. 首先记住,使用网络的时候一定要加入权限,加入到AndroidMainfest. ...

  2. bootstrap插件(对话框)bootbox参数和自定义弹出框宽度设置

    参考:https://hisune.com/post/view/17/bootstrap-plugin-bootbox-and-custom-width-dialog 官网:http://bootbo ...

  3. [Linux]Shell的运算符和特殊变量

    说起Shell脚本,免不了用变量.特别是对于这种一堆符号表示变量的语言来说,你不了解一下相关变量的本意,根本无从下手.譬如写个循环遍历,$#就起了好大作用.所以还是有必要记录一下,也是对学习的一个笔记 ...

  4. am335x 配置 GPIO 为可输入也可输出

    主要配置设备树如下模式即可 0x1AC (PIN_INPUT_PULLUP | MUX_MODE7)

  5. PostgreSql 函数

    DECLARE curParkingTime TIMESTAMP ; curLeavingTime TIMESTAMP; parkingSpaceIndexCode VARCHAR[]; days I ...

  6. ansible普通用户su切换

    [root@361way.com ~]# cat /etc/ansible/hosts [test01] 10.212.52.14 ansible_ssh_user=test ansible_ssh_ ...

  7. [数学-构造矩阵]NEFU 1113

    依据题意.我已经推导出tn的公式.ti=ti.a+ti.b,ti.a=5*t(i-1).a+4*t(i-1).b,ti.b=t(i-1).a+t(i-1).b 然而以下居然不能继续推到sn的公式!!! ...

  8. docker-compose搭建wordpress

    1.安装docker-compose apt-get install docker-compose 发现下载的是旧版本,不支持2.0的配置文件 还是下载新版本吧,去github查看最新版本https: ...

  9. WaitForSingleObject函数的使用

    等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止.  WaitForSingleObject 函数 DWORD WaitForSingleObject( HANDLE hOb ...

  10. jQuery验证控件jquery.validate.js的使用介绍

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...