使用viewModel时,将模型从控制器传递到视图时出现MVC3错误

时间:2012-08-02 17:34:15

标签: asp.net-mvc-3 linq entity-framework-4

对不起,因为我确定有一种方法可以用viewModel来做这件事,但是我对此非常缺乏经验,甚至不知道我是否正确地做了。

我要做的是将多个博客以及发布每个博客的用户的个人资料信息传递给视图。

我收到以下错误。

  

传递到字典中的模型项是类型的   'ACapture.Models.ViewModels.BlogViewModel',但是这本字典   需要类型的模型项   'System.Collections.Generic.IEnumerable`1 [ACapture.Models.ViewModels.BlogViewModel]'。

我正在尝试将以下查询结果传递给视图。

        var results = (from r in db.Blog.AsEnumerable()
                       join a in db.Profile on r.AccountID equals a.AccountID
                       select new { r, a });

        return View(new BlogViewModel(results.ToList()));
    }

这是我的viewModel

public class BlogViewModel
{
    private object p;

    public BlogViewModel(object p)
    {
        this.p = p;
    }
}

我的观点

@model IEnumerable<ACapture.Models.ViewModels.BlogViewModel>
@{
    ViewBag.Title = "Home Page";
}

<div class="Forum">
    <p>The Forum</p>

            @foreach (var item in Model)
            {
                <div class="ForumChild">


                    <img src="@item.image.img_path" alt="Not Found" />
                    <br />
                        <table>
                            @foreach (var comment in item.comment)
                            {

                                <tr><td></td><td>@comment.Commentation</td></tr>
                            }
                        </table>
                </div>                
            }
</div>

提前致谢。

2 个答案:

答案 0 :(得分:2)

我想你需要稍微改变你的视图模型:

public class BlogViewModel
{
    public Blog Blog { get; set; }
    public Profile Profile{ get; set; }
}

然后按以下方式返回:

    var results = (from r in db.Blog.AsEnumerable()
                   join a in db.Profile on r.AccountID equals a.AccountID
                   select new new BlogViewModel { Blog = r, Profile = a });

    return View(results.ToList());

然后在视图内的foreach循环中,您将获得一个包含 - 配置文件和博客信息的对象,因此您可以像f.e.一样使用它。 @item.Profile.Username

答案 1 :(得分:0)

在这种情况下,我并不完全确定您使用ViewModel尝试完成的任务,但您似乎期望该页面代表一个包含评论集的博客。在这种情况下,您应该替换

IEnumerable<ACapture.Models.ViewModels.BlogViewModel>

ACapture.Models.ViewModels.BlogViewModel

然后Model代表一个BlogViewModel,您可以使用Model.comments对注释进行迭代,并使用Model.image.img_path访问该图像。

如果不是这种情况,并且您打算每页有多个BlogViewModel,那么您必须实际构建一个BlogViewModel集合并将其传递给视图。