ASP.NET MVC3控制器传递匿名对象到视图实例

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 />
}

时间: 2024-09-27 02:34:26

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

ASP.NET中MVC从后台控制器传递数据到前台视图的方式_实用技巧

本文实例讲述了ASP.NET中MVC从后台控制器传递数据到前台视图的方式.分享给大家供大家参考.具体分析如下: 数据存储模型Model: 复制代码 代码如下: public class CalendarEvent { public string id { get; set; } public DateTime start { get; set; } public DateTime end { get; set; } public string backgroundColor { get; set

ASP.NET MVC3 增加、修改和删除操作实例

我们再新建一个表,名字命名为"Contact",打开"AndroidDB.edmx"文件,右键选择"从数据库更新模型".这个前边已经介绍过,这里就不多说,这样在实体层就创建了"Contact"类及它的属性.接下来,我们新添加一个名为"ContactController"的控制器类,用来显示我们的留言表单并实现留言功能.我们先看看Controller中的代码,如下:  代码如下 复制代码 public cla

ASP.NET中MVC从后台控制器传递数据到前台视图的方式

  需要添加相应的命名空间: 复制代码 代码如下: using System; using System.Diagnostics; using System.Reflection; 如果仅是获取当前方法名,可以使用如下代码: 代码如下: public static void WriteSysLog(int level, string content) { MethodBase mb = MethodBase.GetCurrentMethod(); string systemModule = En

Asp.Net MVC3 简单入门第一季(一)环境准备

前言 大家好,从今天开始我将写一个关于AspNet MVC3方面学习的总结,并跟初学者一起分享一些基本的基础知识,作者本身也很愿意跟大家一起交流技术,一起交流一起进步,欢迎高手不吝赐教,欢迎大家不同的意见和建议,作者的学识和见识当然有自己的局限性,希望自己能成为不闷骚型的技术人员,而不是只自己享受技术,而不让更多的人来分享你的成果的人. 第一节:关于Asp.Net MVC3 Asp.Net MVC已经到第三版了,相信大家也都熟悉了,我也不再重复相关概念性的东西了.但是大家一定要了解,Asp.Ne

ASP.NET MVC 5 学习教程:控制器传递数据给视图

原文 ASP.NET MVC 5 学习教程:控制器传递数据给视图 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控制器访问模型的数据 生成的代码详解 使用 SQL Server LocalDB Edit方法和Edit视图详解 添加查询 Entity Framework 数据迁移之添加字段 添加验证 Details 和 Delete 方法详解 在讨论数据库和模型之前,让我们先说说容控制器传递数据给视图

ASP.NET MVC 5 - 将数据从控制器传递给视图

原文:ASP.NET MVC 5 - 将数据从控制器传递给视图 在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图.控制器类将响应请求来的URL.控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果会发送回浏览器.视图模板可以被控制器用来产生格式化过的HTML从而返回给浏览器. 控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来Render返回给浏览器的HTML.最佳做法是:一个视图模板应该永远不会执行业务逻辑或

ASP.NET MVC3 JSON数据的传递使用说明

ASP.NET MVC 3 中内置了对 JSON 的绑定支持,使得接收从客户端传递过来的 JSON 格式的数据变得非常简单.本篇还是以 Android 博客项目中的留言小功能来简单的说明一下具体的使用方法.先看看 Razor 视图引擎下的 HTML代码,这块主要用来显示留言的数据列表:  代码如下 复制代码 <div>     <script id="userTemplate" type="text/html">     <div>

ASP.NET MVC之从控制器传递数据到视图四种方式(一)

前言 本系列开始着手讲述ASP.NET MVC,也算是自己对基础的回顾以及进一步深入学习,保证每天发表一篇该系列文章,关于基本知识则不再叙述,园子有关文章不胜枚举,这一系列若有叙述不当或错误之处,欢迎指出以及批评. 前奏 新建基本项目在Models文件夹下定义如下类: public class Person { public int Id { get; set; } public string Name { get; set; } public string BlogAddress { get;

ASP.NET页面间传递对象的另类方法

asp.net|对象|页面  我们知道,Asp.net在不同页面间传递对象的时候可以用Session来实现.现在我想介绍另外一种方法来达到目的.     主要思路:我们需要两个页面,一个Sender.aspx负责发送所需传递的对象,一个Receiver.aspx负责接受send过来的对象.Sender.aspx主要是运用了Server.Transfer来终止当前页面的执行,并开始调入Receiver.aspx来取出对象. 具体实现: ITransfer.cs namespace Sunrise.