不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
ASP.NET MVC3控制器传递匿名对象到视图解决方法
编辑:dnawo 日期:2013-08-31
在ASP.NET MVC3 + Entity Framework项目中,从控制器传递匿名对象到视图非常常见,原本以为用dynamic能轻松搞定,最后发现我错了:
Controller:
View:

其原因是C#的编译器总是将匿名类型编译成internal的,当通过dynamic访问在当前上下文不可见的成员的时候,就会引发异常。问题重现:
以前都用老赵的ToDynamic方法解决,今天在.NET 4.0的System命名空间下看到一个类Tuple,了解后发现用它也可以解决上边的问题:
Controller:
View:

参考资料
[1].使用dynamic在ASP.NET MVC中应用匿名ViewModel:http://blog.csdn.net/deboywang/article/details/6627191
[2].当类型为dynamic的视图模型遭遇匿名对象:http://blog.zhaojie.me/2010/05/asp-net-mvc-dynamic-view-model-binding-error-with-anonymous-types.html
[3].当dynamic遭遇匿名对象所造成的问题初步研究结论:http://www.cnblogs.com/Ivony/archive/2010/05/21/1740546.html
[4].Tuple类:http://msdn.microsoft.com/zh-cn/library/System.Tuple(v=vs.100).aspx
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);
}
{
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 />
}
@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();
}
}
}
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);
}
{
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 />
}
@foreach(var item in Model)
{
@(item.Item1)<text>,</text>@(item.Item2)<br />
}

参考资料
[1].使用dynamic在ASP.NET MVC中应用匿名ViewModel:http://blog.csdn.net/deboywang/article/details/6627191
[2].当类型为dynamic的视图模型遭遇匿名对象:http://blog.zhaojie.me/2010/05/asp-net-mvc-dynamic-view-model-binding-error-with-anonymous-types.html
[3].当dynamic遭遇匿名对象所造成的问题初步研究结论:http://www.cnblogs.com/Ivony/archive/2010/05/21/1740546.html
[4].Tuple类:http://msdn.microsoft.com/zh-cn/library/System.Tuple(v=vs.100).aspx
评论: 0 | 引用: 0 | 查看次数: 5101
发表评论
请登录后再发表评论!