从列表模型中提取标题的单个元素

时间:2014-03-10 02:24:01

标签: c# entity-framework asp.net-mvc-5.1

我有一个List Model有几行。在Model中,我想拉出某些部分显示在页面顶部,一些部分作为数据的标题,然后是数据部分本身。当我将此列表或IEnumeration拉到视图时,它将按预期显示所有数据,但无法显示First()或以其他任何方式获取这些标题。我应该以另一种方式进行View显示吗?

目标:
带有事件名称和日期的标题行(当前位于列表的每一行) 具有自己标头的数据组或表也基于列表中的数据 上述组中的数据详细信息。

我有部分视图来循环核心数据..

请咨询?

代码很混乱,但这里是:

查看

@model IEnumerable<eManager.Web2.Models.EventClassCompListVM>

@{
    ViewBag.Title = "EventCompClassReport";
}

<h2>EventCompClassReport</h2>


<table class="table">

    @Html.DisplayFor(model => model.EventName) //Tried several ways to identify this, but it is in the List so no way to single it out.


        @Html.EditorForModel()

}

</table>

部分视图(按预期循环通过列表工作)

@model eManager.Web2.Models.EventClassCompListVM
<tr>
    <td>
        @Html.DisplayFor(modelItem => Model.Comp_EventID)
    </td>
    <td>
        @Html.DisplayFor(modelItem => Model.CompName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => Model.ClassName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => Model.ClassOrder)
    </td>
    <td>
        @Html.DisplayFor(modelItem => Model.IsCrossOver)
    </td>
</tr>    

控制器类(虽然它只返回几行数据)

 public ActionResult BuildEventClassReports()
        {
            var model = from o in _db.Events
                           join o2 in _db.Event_Classes on o.EventID equals o2.EventID
                           where o.EventID.Equals(o2.EventID)
                           join o3 in _db.Event_Class_Compeditors_s on o2.EventClassID equals o3.EventClassID
                           where o2.EventClassID.Equals(o3.EventClassID)
                           join o4 in _db.Compeditors on o3.CompeditorId equals o4.CompeditorId
                           where o3.CompeditorId.Equals(o4.CompeditorId)
                           join o5 in _db.Class_Definitions on o2.ClassID equals o5.Class_Definition_ID
                           where o2.ClassID.Equals(o5.Class_Definition_ID)
                           where o.CurrentEvent.Equals(true)
                           orderby o2.ClassOrder
                           //orderby o3.Comp_EventID

                           select new EventClassCompListVM { 
                                                            EventName = o.EventName,
                                                            EventDate = o.Date_End,
                                                            ClassName = o5.Class_Name,
                                                            Comp_EventID = o3.Comp_EventID,
                                                            ClassOrder = o2.ClassOrder,
                                                            CompName = (o4.FirstName + " " + o4.LastName),
                                                            IsCrossOver = o3.IsCrossOver };

            return View(model);

修改

一些让我更接近的新代码......但我看不出如何从第一个foreach中获取一些数据部分。代码行@ Html.Display只是不起作用..文本“mumbo Jumbo”效果很好并且分组了。任何帮助表示赞赏。!!

当前视图代码:

   <h2>
        @(Model.Any() ? Model.First().EventName : "")
        @(Model.Any() ? Model.First().EventDate.ToShortDateString() : "")

    </h2>

        @foreach (var group in Model.GroupBy(item => item.ClassID))
                {
                        <tr><td><b>mumbo jumbo</b>
                            </td></tr>
            @Html.DisplayFor(modelItem => Model.ClassName) //Cannot get this line to work. 

                    foreach (var item in group)
                    {
                        <tr>
                            <td>
                                @Html.DisplayFor(modelItem => item.Comp_EventID)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.CompName)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.ClassName)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.ClassOrder)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.IsCrossOver)
                            </td>
                        </tr>

                    }

                }

1 个答案:

答案 0 :(得分:0)

我确信有更好的方法可以做到这一点,但我现在能想到的是将标题存储为一个单独的列表。

创建一个新类作为视图的模型,并包含标题列表和数据。 e.g。

public class MainViewModel
{
    public IEnumerable<string> Titles { get; set;}
    public IEnumerable<eManager.Web2.Models.EventClassCompListVM> Models { get; set;}
}

在BuildEventClassReports()操作中相应地填充此类,并将此类传递给视图。

然后,您可以使用@ Html.Partial(“viewname”,Model.EventClassCompListVM)将Model.EventClassCompListVM传递给局部视图