如何为使用Linq Collection的视图传递Title

时间:2010-10-12 00:21:19

标签: linq-to-sql asp.net-mvc-2

我正在学习Linq和MVC2我正在取得进步,但是我对如何将页面描述变为使用集合的View感到困惑。

在我的控制器中,我有以下构造

public ActionResult Group(int id)
{
    var result = (from d in db.ErrorDetails.Where(r => r.ErrorTerminal.ErrorTerminalGroupID == id)
                  orderby d.ErrorTerminal.TerminalNumber ascending, d.ErrorRecordedAt descending
             select d);

    return View(result);
}

和我的观点

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>????? how to get a title from the 1st record?????</h2>
<table>
<%
        foreach (var item in Model) {
%>
//code for setup of the rows etc
<% }%>
</table>

如何从我制作的Linq查询中获取标题,或者我是否需要制作一个ViewModel来存放它?

3 个答案:

答案 0 :(得分:2)

我创建了一个ViewModel来存放您的标题,因此您的标题是从列表的第一项派生的事实是单独的页面代码,而您的页面代码只包含表示逻辑。

答案 1 :(得分:0)

像这样:

<%= Html.Encode(Model.First().Title) %>

如果没有项目,则会抛出异常。

如果您想要一个不在第一项中的标题,则需要使用具有Title属性的ViewModel类。

答案 2 :(得分:0)

请不要将IEnumerable<T>传递给您的观点。而是考虑使用List<T>并在控制器中进行首次枚举。我只推荐ViewModel的这种模式,因为你可以捕获控制器代码中第一次枚举的例外,而不是让视图渲染死得很厉害并导致部分HTML输出,因为控制器搞砸了并传递了一些它不可能的视图完全列举。

话虽这么说,但最好的方法是使用ViewModel并将其设置为string TitleList<ErrorDetail> ErrorDetails

public class GroupErrorDetailsViewModel
{
    public string Title { get; set; }
    // NOTE: assuming db.ErrorDetails is of type Table<ErrorDetail>
    public List<ErrorDetail> ErrorDetails { get; set; }
}

public ActionResult Group(int id)
{
    // FIXME: this direct database query should not really be in the controller
    var result =
        from d in db.ErrorDetails
        where d.ErrorTerminal.ErrorTerminalGroupID == id
        orderby d.ErrorTerminal.TerminalNumber ascending, d.ErrorRecordedAt descending
        select d;

    var resultList = result.ToList();

    var viewModel = new GroupErrorDetailsViewModel
    {
        Title = resultList.Count > 0 ? resultList[0].Title : "Default Title",
        ErrorDetails = resultList
    };

    return View((object)viewModel);
}