我在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,其中包含两个查询。我想有两个循环,每个循环运行一个查询。
非常感谢提前。
答案 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)
{
}