【问题标题】:Custom Query won't pass to view through viewmodel自定义查询不会通过视图模型传递给视图
【发布时间】:2020-09-10 16:32:43
【问题描述】:

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

班级

 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>

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

视图模型

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

所以我被困在如何让自定义查询使用视图模型。感谢您的帮助。

【问题讨论】:

    标签: asp.net-mvc entity-framework linq razor


    【解决方案1】:

    试试这个:

    @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>
    

    【讨论】:

    • 非常感谢,成功了。我现在确定我有什么样的大脑冻结。认为我遇到的问题是路径中的许多 Enumerables 并回答您的最后一个问题,检查它显示的 test3:(新 System.Collections.Generic.Mscorlib_CollectionDebugView(test3).Items[0])。交流类型。再次感谢!!!!!!
    【解决方案2】:

    您正在浏览 AircraftViewModel 数据的 IEnumerable,然后该数据具有 TailNo 的 IEnumerable。你必须做一个嵌套的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>
    

    【讨论】:

    • 还是不行。我现在收到错误消息:'传递到字典中的模型项的类型为'TADSVer2_1.ViewModels.AircraftViewModel',但此字典需要 System.Collections.Generic.IEnumerable`1[TADSVer2_1.ViewModels 类型的模型项。 AircraftViewModel]''.
    • 确保模型定义为:model IEnumerable - 听起来好像 IEnumerable 已被移除,并且正在传递单个项目
    • 在顶行的视图中是:@model IEnumerable 并且在 ViewModel 中查询结果分配给:public IEnumerable AircraftId { get;放; } 当我编译时,在页面尝试打开之前我没有收到任何错误。所以我很难过。
    • 是不是因为 var test3 是 TailNo 的列表,因为您在查询后进行选择?因此,在您看来,它应该是 IEnumerable?如果是这种情况,那么在视图中更改它是唯一的事情,因为你的 foreach 应该可以工作
    • 我检查它是 TailNo 的列表,因为我可以在它设置为视图模型之前对其使用 foreach。我改变了看法,但没有奏效。我仍然收到错误消息:传入字典的模型项的类型为“TADSVer2_1.ViewModels.AircraftViewModel”,但此字典需要类型为“System.Collections.Generic.IEnumerable`1[TADSVer2_1.Models.TailNo”的模型项]'。感谢所有帮助我希望我们能解决这个问题,因为我需要使用 ViewModel 将列表发送到 View。
    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多