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