如何仅从剃刀视图中列表视图模型的 foreach 循环中获取第一项

Man*_*anu 3 c# model-view-controller razor-pages

我的 razor 视图绑定到由 ActionResult 控制器传递的 ListViewModel;请参阅下面的代码片段:

视图模型

    public class TicketItemViewModel
{
    public int Id { get; set; }
    public int? UserId { get; set; }
    public int? TicketId { get; set; }
    public string Title { get; set; }

    [AllowHtml]
    public string Body { get; set; }
    public DateTime? Posted { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

控制器

        public ActionResult TicketHistoryC(int ticketId)
    {
        var ticket = UnitOfWork.GetById<Ticket>(ticketId);

        var entities = UnitOfWork.GetAll<TicketItem>().Where(u => u.TicketId == ticketId).OrderByDescending(u => u.Posted).ToList();

        List<TicketItemViewModel> listModel = new List<TicketItemViewModel>();

        foreach (var entity in entities)
        {
            TicketItemViewModel model = new TicketItemViewModel();
            model.Body = entity.Body;
            model.Posted = entity.Posted;
            model.UserId = entity.UserId;
            model.TicketId = entity.TicketId;
            model.Id = entity.Id;
            model.Title = ticket.Title.ToString();
            listModel.Add(model);
        }

        return View(listModel);
    }
Run Code Online (Sandbox Code Playgroud)

在视图的顶部,我想显示 ViewModel 第一项的属性。以下是我的最佳尝试:

@model IEnumerable<Presentation.Host.Models.TicketItemViewModel>

@{int i = 0;}

@foreach (var item in Model)
{
    if (i == 1)
    {
        break;
    }
    else
    {
        <h2>@Html.DisplayFor(modelItem => item.Title)</h2>
        i = i + 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码有效,但我想知道是否有更好或更有效的方法来仅获取第一项?

Kar*_*ran 7

您可以使用Linq并首先检查您是否Model至少有一条记录,然后使用Model.First()来获取第一条记录。

@model IEnumerable<Presentation.Host.Models.TicketItemViewModel>

@if (Model.Any())
{
    <h2>@Html.DisplayFor(modelItem => Model.First().Title)</h2>
}
Run Code Online (Sandbox Code Playgroud)

编辑Model.Take(1):或者我们也可以使用。

Enumerable.Take:从序列开头返回指定数量的连续元素。

@model IEnumerable<Presentation.Host.Models.TicketItemViewModel>

@foreach (var item in Model.Take(1))
{
    <h2>@Html.DisplayFor(modelItem => Model.First().Title)</h2>
}
Run Code Online (Sandbox Code Playgroud)