传递带有两个对象集合的元组来查看?

时间:2012-05-31 15:26:16

标签: c# asp.net asp.net-mvc-3 tuples

我想传递两个对象集合。首先是Post,第二个是Gallery。但是我收到错误,我不知道如何解决这个问题。

我在传递两个单个对象时已经完成了这个并且它工作正常,但现在我需要传递这些对象的两个集合并且它给了我错误。

错误

  

传递到字典中的模型项是类型的   “System.Tuple 2[System.Linq.IQueryable 1 [photoBlog.Models.Gallery],System.Linq.IQueryable 1[photoBlog.Models.Post]]', but this dictionary requires a model item of type 'System.Tuple 2 [System.Collections.Generic.IEnumerable 1[photoBlog.Models.Gallery],System.Collections.Generic.IEnumerable 1 [photoBlog.Models.Post] ]”。

控制器

public ActionResult Index()
{
    photoBlogModelDataContext _db = new photoBlogModelDataContext();
    var posts = _db.Posts.OrderByDescending(x => x.DateTime).Take(4);
    var galleries = _db.Galleries.OrderByDescending(x => x.ID).Take(4);
    return View(Tuple.Create(galleries, posts));
}

查看

@model Tuple<IEnumerable<photoBlog.Models.Gallery>, IEnumerable<photoBlog.Models.Post>>
@foreach (var item in Model.Item1)
{
   @item.Name
}

3 个答案:

答案 0 :(得分:4)

我认为您应该将控制器方法修改为:

public ActionResult Index()
{
    photoBlogModelDataContext _db = new photoBlogModelDataContext();
    var posts = _db.Posts.OrderByDescending(x => x.DateTime).Take(4).ToArray();
    var galleries = _db.Galleries.OrderByDescending(x => x.ID).Take(4).ToArray();
    return View(Tuple.Create(galleries, posts));
}

从错误消息中可以看出,在呈现视图时,查询尚未解析。通过执行ToArray或ToList,您将在从控制器方法返回之前强制查询命中数据库。

答案 1 :(得分:1)

您需要在domain.Model

中创建一个新实体

这是我今天提供的一个例子: MVC3: button to send both form (model) values and an extra parameter
后来编辑:

namespace App.Domain.Model
{
    public class Tuple
    {
        public IEnumerable<photoBlog.Models.Gallery> Gallery{ get; set; }
        public IEnumerable<photoBlog.Models.Post> Post{ get; set; }
    }
}

您将按如下方式将Tuple对象发送到您的视图:

@model: (Domain.Model.)Tuple  <--- (your exact model path )
@foreach (var item in Model.Gallery)
{
   @item.Name
}

另一个可能性是使用viewbag ......但我强烈建议你以正确的方式去做,即。 MVC方式

答案 2 :(得分:0)

试试这个

var posts = _db.Posts.OrderByDescending(x => x.DateTime).Take(4).ToList();
var galleries = _db.Galleries.OrderByDescending(x => x.ID).Take(4).ToList();