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

0 asp.net-mvc-3

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

该模型

public class AggregateModel
{
    public List<Task> Tasks { get; set; }
    public List<Event> Events { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

如果视图删除冗余位,则这是大多数:

@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>
Run Code Online (Sandbox Code Playgroud)

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

提前谢谢了.

Dar*_*rov 7

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

@model AggregateModel
Run Code Online (Sandbox Code Playgroud)

并不是

@model IEnumerable<Task>
Run Code Online (Sandbox Code Playgroud)

然后你可以循环:

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

...

@foreach (var item in Model.Events)
{
}
Run Code Online (Sandbox Code Playgroud)

并且因为在视图中循环是丑陋的,你应该使用编辑器/显示模板,这将简化你的代码:

@Html.DisplayFor(x => x.Tasks)
...
@Html.DisplayFor(x => x.Events)
Run Code Online (Sandbox Code Playgroud)

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