MVC 3:将多个查询传递给视图

时间:2011-04-28 20:01:37

标签: asp.net-mvc-3

我在AggregateModel中有两个查询,我希望它们被传递到索引视图,以便在两个单独的foreach循环中使用。但截至目前,他们都是在一个模型中通过。

模特

public class AggregateModel
{
    public List<Task> Tasks { get; set; }
    public List<Event> Events { get; set; }
}

HomeController.cs

var model = new AggregateModel();
model.Tasks = db.Task.Where(n => (n.UserId == UserID) && (n.Completed == false) && (n.Due < dateTime)).ToList();
model.Events = db.Events.Where(n => (n.UserId == UserID) && (n.Start < dateTime)).ToList();

return View(model);

如果视图删除冗余位,则占多数:

@model IEnumerable<ProjectApp.Models.AggregateModel>

<div id="upcoming-tasks">
    <h4>Your Upcoming Tasks</h4>

    <ul class="upcoming">
    @foreach (var item in Model.Tasks)
    {
        <li>@Html.ActionLink(item.Title, "Details", new { id = item.TaskId })</li>
    }
    <li>Add a @Html.ActionLink("Task", "Create", "Task")</li>
    </ul>
</div>

<div id="upcoming-events">
    <h4>Your Upcoming Events</h4>

    <ul class="upcoming">
    @foreach (var item in Model.Events)
    {
        <li>@Html.ActionLink(item.Title, "Details", new { id = item.EventId })</li>
    }
    <li>Add a @Html.ActionLink("Task", "Create", "Task")</li>
    </ul>
</div>

如您所见,foreach循环调用Model,其中包含两个查询。我想有两个循环,每个循环运行一个查询。

非常感谢提前。

2 个答案:

答案 0 :(得分:7)

在您的视图顶部,您应该:

@model AggregateModel

而不是

@model IEnumerable<Task>

然后你可以循环:

@foreach (var item in Model.Tasks)
{
}

...

@foreach (var item in Model.Events)
{
}

因为在视图中循环很难看,所以你应该使用编辑器/显示模板来简化你的代码:

@Html.DisplayFor(x => x.Tasks)
...
@Html.DisplayFor(x => x.Events)

您应该在其中定义将为集合的每个元素呈现的相应~/Views/Shared/DisplayTemplates/Task.cshtml~/Views/Shared/DisplayTemplates/Event.cshtml模板。

答案 1 :(得分:1)

我可能误解了你的问题,但我认为你的问题的解决方案是:)

@foreach (var item in Model.Tasks)
{
}

@foreach (var item in Model.Events)
{
}