首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ViewBag中存储匿名对象

在ViewBag中存储匿名对象
EN

Stack Overflow用户
提问于 2012-01-24 07:20:30
回答 3查看 10.3K关注 0票数 20

这可能是一个愚蠢的问题,但我正在尝试在ViewBag中填充一个匿名对象,如下所示:

代码语言:javascript
复制
ViewBag.Stuff = new { Name = "Test", Email = "user@domain.com" };

并从视图访问它,如下所示:

@ViewBag.Stuff.Name

我知道ViewBag是动态的,“东西”是一个匿名对象……但是,当我从上面的View行查看调试器时,我可以看到具有正确值的所有属性。为什么模型活页夹在这方面遇到了这么大的困难?

有没有一种不创建模型类就能做到这一点的好方法?我想继续使用new {}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-24 07:47:36

本质上,问题是匿名类型是作为内部(see answer)生成的,这使得在视图中不可能对对象的属性进行硬类型引用。本文提供了更详细的解释:

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

可以使用动态匿名包装器类(@Dakill的答案)来完成,但很快就会变得丑陋,应该让程序员问为什么他/她会这样做。

票数 9
EN

Stack Overflow用户

发布于 2012-01-24 09:03:58

与人们普遍认为的相反,这是可以做到的,但涉及到一种丑陋的黑客行为,这将导致未来的维护问题。它涉及到编写一个类来将匿名对象“包装”到一个动态对象中。前段时间我把它当做练习,下面是包装器类的代码,你可以像ViewBag.Stuff = new DynamicAnonymous(new { Name = "Test", Email = "user@domain.com" });一样使用它。

代码语言:javascript
复制
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);
            }                
 }
票数 5
EN

Stack Overflow用户

发布于 2017-01-27 16:28:47

您可以使用NothingsImpossible描述的机制来实现,但不需要使用ExpandoObject实现您自己的包装器。下面是一个示例:

代码语言:javascript
复制
var items = _repository.GetItems()
    .Select(og => {
        dynamic eo = new System.Dynamic.ExpandoObject();
        eo.Id = item.Id;
        eo.FriendlyName = og.FriendlyName;
        eo.Selected = itemIds.Contains(item.Id);
        return eo;
    })
    .ToArray();
ViewBag.Items = items;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8980045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档