我正在学习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来存放它?
答案 0 :(得分:2)
我创建了一个ViewModel来存放您的标题,因此您的标题是从列表的第一项派生的事实是单独的页面代码,而您的页面代码只包含表示逻辑。
答案 1 :(得分:0)
像这样:
<%= Html.Encode(Model.First().Title) %>
如果没有项目,则会抛出异常。
如果您想要一个不在第一项中的标题,则需要使用具有Title
属性的ViewModel类。
答案 2 :(得分:0)
请不要将IEnumerable<T>
传递给您的观点。而是考虑使用List<T>
并在控制器中进行首次枚举。我只推荐ViewModel的这种模式,因为你可以捕获控制器代码中第一次枚举的例外,而不是让视图渲染死得很厉害并导致部分HTML输出,因为控制器搞砸了并传递了一些它不可能的视图完全列举。
话虽这么说,但最好的方法是使用ViewModel并将其设置为string Title
和List<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);
}