自定义查询不会通过ViewModel传递给视图

问题描述

我有一个自定义查询,我想通过一个视图模型传递给该视图。我可以将查询直接传递给视图,并且可以正常工作,但是当我尝试将其与视图模型传递给视图时,会出现错误。我知道必须有一个简单的答案,但是如果我能弄清楚的话,我会被绞死。

班级

 namespace TADSVer2_1.Models
{
  public class TailNo
  {
    public string TailNos { get; set; }
    public string Base { get; set; }
    public string ACType { get; set; }
  }
}

查询查询工作正常,可以获取所需的数据。

 var test3 = _context.Aircrafts.Where(c => c.BaseId == 4).Include(c => c.ACType).Include(c => c.Base)
            .Select(c => new TailNo {
              TailNos = c.TailNumber,ACType = c.ACType.Type,Base = c.Base.Name }).ToList();

视图

@model IEnumerable<TADSVer2_1.ViewModels.AircraftViewModel>
@{
  ViewBag.Title = "Index";
  Layout = "~/Views/Shared/_Layout.cshtml";
}
<ul>
   @foreach (var i in Model)
  {
    <li>
       @i.TailNos " " @i.Base " " @i.ACType
    </li>
  }
</ul>

上面的代码可以正常工作,但是当我使用视图模型时,出现如下所列的错误。

ViewModel

namespace TADSVer2_1.ViewModels
{
  public class AircraftViewModel
  {
    public IEnumerable<TailNo> TailNo { get; set; }
  }

}

我收到的第一条错误消息是:

 'AircraftViewModel' does not contain a definition for 'TailNos' and no extension method     'TailNos' accepting a first argument of type 'AircraftViewModel' could be found (are you missing a      using directive or an assembly reference?)

所以我从视图中删除了IEnumerable,并且出现了这个错误:

  foreach statement cannot operate on variables of type 'AircraftViewModel' because 'AircraftViewModel' does not contain a public instance definition for 'GetEnumerator'

所以我替换了视图中的IEnumerable并在视图模型中尝试了此错误并得到了编译错误

 public TailNo TailNo { get; set; }

     Error  CS1061  'AircraftViewModel' does not contain a definition for 'TailNos' and no   accessible extension method 'TailNos' accepting a first argument of type 'AircraftViewModel' could be found (are you missing a using directive or an assembly reference?)  TADSVer2_1  D:\Programing_ Examples\MVC_Examples\MVC Exercises\TADSVer2_1\TADSVer2_1\Views\Aircraft\Index.cshtml    12  Active

因此,我被困在如何获取自定义查询以使用viewmodel的问题上。感谢您的帮助。

解决方法

您正在查看IEnumerable的AircraftViewModel数据,然后该数据具有IEnumerable的TailNo。您必须做一个嵌套的foreach(下面的示例):

@model IEnumerable<TADSVer2_1.ViewModels.AircraftViewModel>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<ul>
    @foreach (var i in Model)
    {
        @foreach (var tail in i.TailNo)
        {
            <li>
                @tail.TailNos " " @tail.Base " " @tail.ACType
            </li>
        }
    }
</ul>
,

尝试一下:

@model TADSVer2_1.ViewModels.AircraftViewModel
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<ul>
    @foreach (var i in Model.TailNo)
    {
            <li>
                @i.TailNos " " @i.Base " " @i.ACType
            </li>
    }
</ul>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...