Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用ToExpando方法的问题_Asp.net Mvc_Linq_Entity Framework_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc 使用ToExpando方法的问题

Asp.net mvc 使用ToExpando方法的问题,asp.net-mvc,linq,entity-framework,asp.net-mvc-3,razor,Asp.net Mvc,Linq,Entity Framework,Asp.net Mvc 3,Razor,嗨,我尝试使用ToExpando解决方案在razor视图中使用匿名类。 我使用此解决方案-> 我将写下我所做的: 我添加了一个文件扩展名.cs,其中我放置了以下代码: public static class Extensions { public static ExpandoObject ToExpando(this object anonymousObject) { IDictionary<string, object> anonymousDicti

嗨,我尝试使用ToExpando解决方案在razor视图中使用匿名类。 我使用此解决方案->

我将写下我所做的:

  • 我添加了一个文件扩展名.cs,其中我放置了以下代码:

    public static class Extensions
    {
        public static ExpandoObject ToExpando(this object anonymousObject)
        {
            IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject);
            IDictionary<string, object> expando = new ExpandoObject();
            foreach (var item in anonymousDictionary)
                expando.Add(item);
            return (ExpandoObject)expando;
        }
    }
    
  • 在foreach行中,我得到了一个例外:

    RuntimeBinderException:“System.Dynamic.ExpandoObject”不包含“article\u id”的定义


    我做错了什么?

    您需要先调用
    .AsEnumerable()
    .ToList()
    以强制
    在客户端上运行Expando

    尝试:

    dynamic articles = (from p in db.Articles.Where(p => p.user_id == 2_
                    select new
                    {
                        p.article_id,
                        p.title,
                        p.date,
                        p.category,
                        AverageScore = db.Articles_Scores
                            .Where(o => o.user_id == p.user_id && p.article_id == o.article_id)
                            .Average(m => m.score)
                    }).AsEnumerable()
                      .Select(r => r.ToExpando());
    
    编辑:确保声明
    动态
    var

    编辑2:在您的
    for
    外观中,您再次声明了
    var
    。将其更改为:

    @foreach (dynamic item in Model) {
        // some code
        @item.article_id // HERE IS EXCEPTION
    }
    

    问题是
    HtmlHelper.AnonymousObjectToHtmlatAttributes()
    ,它正在替换
    属性名为'''.'和'-'。查看该方法的注释。

    好的,在前两个答案的基础上,我添加了另一个扩展方法,我很惊讶这里没有看到:

    public static List<ExpandoObject> ToExpandoList<T>(this IEnumerable<T> ie) {
        return ie.Select(o => o.ToExpando()).ToList();            
    }
    

    您还没有显示实际调用
    扩展的代码。对不起,我忘了。现在我更新了。你是说我应该使用ToExpando().AsEnumerable()?如果是这样,我给出了一个类似的例外:/No;您需要首先调用
    AsEnumerable
    ,以便
    ToExpando
    在clientOk上运行。但是我得到了一个例外:RuntimeBinderException:'System.Dynamic.ExpandoObject'不包含'article_id'的定义我得到了一个例外:RuntimeBinderException:'System.Dynamic.ExpandoObject'不包含'article_id'的定义谢谢Matthew的帮助,但它仍然不起作用。我使用了IEnumerable,现在我使用了你的解决方案,但仍然存在相同的问题。真奇怪。。。因为它在controler方法中工作得非常完美(foreach工作得非常好,我可以读取每个属性),但在View(Razor)中,我得到了相同的例外。我真的不知道我做错了什么…我更新了我的帖子。查看linq查询下面的代码。我还通过评论检查了一个我遇到异常的地方。对我有效的是这样做。。。(从…(选择新建{}).ToExpando()).ToList()。基本上,确保expando位于实际创建的对象上,而不是之后。用另一种方法(使用新的选择)也会起作用,实际上可能看起来更干净。编辑1非常重要,因为对象是在那里创建的。在我的例子中,编辑2不是必需的,即@foreach(模型中的var项)工作得很好。ToExpando().ToList()对我不起作用,但是你的.ToExpandoList()助手成功了。
    dynamic articles = (from p in db.Articles.Where(p => p.user_id == 2_
                    select new
                    {
                        p.article_id,
                        p.title,
                        p.date,
                        p.category,
                        AverageScore = db.Articles_Scores
                            .Where(o => o.user_id == p.user_id && p.article_id == o.article_id)
                            .Average(m => m.score)
                    }).AsEnumerable()
                      .Select(r => r.ToExpando());
    
    @foreach (dynamic item in Model) {
        // some code
        @item.article_id // HERE IS EXCEPTION
    }
    
    public static List<ExpandoObject> ToExpandoList<T>(this IEnumerable<T> ie) {
        return ie.Select(o => o.ToExpando()).ToList();            
    }
    
    var peoples = from f in "tom dick susan roberto".Split(' ') 
                  select new { FirstName = f, Age = f.Length };
    ViewBag.People = peoples.ToExpandoList();