asp.net core pass linq lambda 查看

asp.net core pass linq lambda to view

我正在使用 asp.net core,当我通过 linq lambda query 查看时出现此错误:

An unhandled exception occurred while processing the request.

InvalidOperationException: The model item passed into 
the ViewDataDictionary is of type 'System.Collections.Generic.List`1[<>f__AnonymousType7`1[System.Int64]]',
but this ViewDataDictionary instance 
requires a model item of type 'System.Collections.Generic.IEnumerable`1[HRMS.Salaries]'.

这是我的查询:

public async Task<IActionResult> Index()
{
  var salary = (from salaries in _context.Salaries select new { salaries.Id });
  return View(await salary.ToListAsync());
}

在我使用的视图中:

@model IEnumerable<HRMS.Salaries>

  @foreach (var item in Model)
  {
    <tr>
       <td>@item.Id</td> 
    </tr>
  } 

您在查询中创建对象是否有原因?如果不是,试试这个:

public async Task<IActionResult> Index()
        {
            var salary = (from salaries in _context.Salaries
                          select salaries.Id
                      );
            return View(await salary.ToListAsync());
        }

那么在你看来:

@model IEnumerable<int>

                    @foreach (var item in Model)
                    {
                        <tr>
                            <td>@item</td> 
                        </tr>
                    } 

否则,如果您需要该对象,请在查询中使用:

public async Task<IActionResult> Index()
            {
                var salary = (from salaries in _context.Salaries
                              select salaries
                          );
                return View(await salary.ToListAsync());
            }

并保持你的观点不变:

@model IEnumerable<HRMS.Salaries>

                        @foreach (var item in Model)
                        {
                            <tr>
                                <td>@item.Id</td> 
                            </tr>
                        } 

EDIT :如果您想将多个字段传递给您的视图,最好使用一个新对象。为此,创建一个包含必填字段的 class(例如,SalaryDetailsViewModel)。然后在你的控制器中:

public async Task<IActionResult> Index()
        {
            var salary = (from salaries in _context.Salaries
                          select new SalaryDetailsViewModel { 
                              Id = salaries.Id,
                              Amount = salaries.Amount,
                              Date = salaries.Date,
                              JobTitle = salaries.JobTitle.Name }
                      );
            return View(await salary.ToListAsync());
        }

然后调整您的视图以调用自定义对象的不同字段,用于显示目的,例如:

@model IEnumerable<SalaryDetailsViewModel>

                        @foreach (var item in Model)
                        {
                            <tr>
                                <td>@item.Id</td>
                                <td>@item.Amount</td>
                                <td>@item.Date</td>
                                <td>@item.JobTitle</td>
                            </tr>
                        }