在ViewBag中存储匿名对象?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

这可能是一个愚蠢的问题,但我试图填充一个匿名对象ViewBag像这样:

ViewBag.Stuff = new { Name = "Test", Email = "user@domain.com" };

并从一个视图访问它像这样:

@ ViewBag.Stuff.Name

我理解ViewBag是动态的,“Stuff”是一个匿名对象......但是当我从上面的View行查看调试器时,我可以看到具有正确值的所有属性。为什么模型联编程序在这方面遇到困难?

有没有一种好的方法可以在不创建模型类的情况下实现这一点?我想继续使用new {}

提问于
用户回答回答于

本质上,问题在于匿名类型是以内部方式生成的,从而无法从视图中强制类型化引用该对象的属性。本文提供了更详细的解释:

http://www.heartysoft.com/anonymous-types-c-sharp-4-dynamic

使用动态匿名封装类可以完成,但是会变得很难看,并且应该让程序员问他为什么会这样做。

用户回答回答于

下面是包装类的代码,你会使用它ViewBag.Stuff = new DynamicAnonymous(new { Name = "Test", Email = "user@domain.com" });

public class DynamicAnonymous : DynamicObject
{
            object obj;

            public DynamicAnonymous(object o)
            {
                    this.obj = o;
            }

            public override IEnumerable<string> GetDynamicMemberNames()
            {
                    return obj.GetType().GetProperties().Select(n => n.Name);
            }

            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                    var prop = obj.GetType().GetProperty(binder.Name);
                    if (prop == null)
                    {
                            result = null;
                            return false;
                    }
                    else
                    {
                            result = prop.GetValue(obj, null);
                            return true;
                    }
            }

            public override int GetHashCode()
            {
                    return obj.GetHashCode();
            }

            public override string ToString()
            {
                    return obj.ToString();
            }

            public override bool Equals(object obj2)
            {
                    return obj.Equals(obj2);
            }                
 }

扫码关注云+社区