Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 有人知道为什么在一个视图中显示来自两个模型的数据的foreach(模型中的var项)会出现错误吗?_.net_Asp.net Mvc_Asp.net Core_Model View Controller_Model - Fatal编程技术网

.net 有人知道为什么在一个视图中显示来自两个模型的数据的foreach(模型中的var项)会出现错误吗?

.net 有人知道为什么在一个视图中显示来自两个模型的数据的foreach(模型中的var项)会出现错误吗?,.net,asp.net-mvc,asp.net-core,model-view-controller,model,.net,Asp.net Mvc,Asp.net Core,Model View Controller,Model,我有两个不同的模型,它们的控制器连接在一个模型中,然后在从另一个索引ASP.NET Core 5视图调用的单个局部视图中显示它 这是主索引视图 @model Local.Web.Models.SoundModel @namespace Local.Web.Views @{ if (ViewData.TryGetValue("ParentLayout", out var parentLayout)) { Layout = (string)pare

我有两个不同的模型,它们的控制器连接在一个模型中,然后在从另一个索引ASP.NET Core 5视图调用的单个局部视图中显示它

这是主索引视图

@model Local.Web.Models.SoundModel
@namespace Local.Web.Views
@{
    if (ViewData.TryGetValue("ParentLayout", out var parentLayout))
    {
        Layout = (string)parentLayout;
    }
    else
    {
        Layout = "/Views/Shared/_Layout.cshtml";
    }
}

<h2>Index Principal</h2>
<div class="row">
    <div class="col-md-6">
        <partial name="_Sounds" />
    </div>
</div>
这是列出声音类型的TipSoundModel

using System;   
namespace Local.Web.Models
{
    public class TipSoundModel
    {
        public Guid Id { get; set; }
        public string Tipo { get; set; }
        public string Nombre_ES { get; set; }

    }
}
这是SoundModel模型,它将前面的两个模型结合在一起,以便能够从单个视图查看它们

namespace Local.Web.Models
{
    public class SoundModel
    {
        public Sound1Model sound { get; set; }
        public TipSoundModel tipSound { get; set; }
    }
}
这是负责收集要显示的声音的SoundController控制器

using System.Linq;
using Local.Web.Models;
using Microsoft.AspNetCore.Mvc;
using Local.Datos.Repositorios;

namespace Local.Web.Controllers
{
    public class SoundController : Controller
    {
        private IRepositorioSonido _repositorioSonido;
        public SoundController(IRepositorioSonido repositorioSonido)
        {
            _repositorioSonido = repositorioSonido;
        }

        public IActionResult _Sounds()
        {
            var sonidos = _repositorioSonido.ListarTodos();
            var model = sonidos.Select(s => new Sound1Model
            {
                Id = s.Id,
                Tipo = s.Tipo,
                Nombre = s.Nombre,
            });

            return PartialView(model);
        }

        public IActionResult Index()
        {
            return View();
        }

    }
}
using Local.Datos.Repositorios;
using Local.Web.Models;
using Microsoft.AspNetCore.Mvc;
using System.Linq;

namespace Local.Web.Controllers
{
    public class TipSoundController : Controller
    {
        private IRepositorioTipoSonido _repositorioTipoSonido;
        public TipSoundController(IRepositorioTipoSonido repositorioTipoSonido)
        {
            _repositorioTipoSonido = repositorioTipoSonido;
        }
        public IActionResult _TipSounds()
        {
            var tiposSonidos = _repositorioTipoSonido.ListarTodos();
            var model = tiposSonidos.Select(s => new TipSoundModel
            {
                Id = s.Id,
                Tipo = s.Tipo,
                Nombre_ES = s.Nombre_ES,
            });

            return PartialView(model);
        }
    }
}
这是负责收集要显示的声音类型的TipSoundController控制器

using System.Linq;
using Local.Web.Models;
using Microsoft.AspNetCore.Mvc;
using Local.Datos.Repositorios;

namespace Local.Web.Controllers
{
    public class SoundController : Controller
    {
        private IRepositorioSonido _repositorioSonido;
        public SoundController(IRepositorioSonido repositorioSonido)
        {
            _repositorioSonido = repositorioSonido;
        }

        public IActionResult _Sounds()
        {
            var sonidos = _repositorioSonido.ListarTodos();
            var model = sonidos.Select(s => new Sound1Model
            {
                Id = s.Id,
                Tipo = s.Tipo,
                Nombre = s.Nombre,
            });

            return PartialView(model);
        }

        public IActionResult Index()
        {
            return View();
        }

    }
}
using Local.Datos.Repositorios;
using Local.Web.Models;
using Microsoft.AspNetCore.Mvc;
using System.Linq;

namespace Local.Web.Controllers
{
    public class TipSoundController : Controller
    {
        private IRepositorioTipoSonido _repositorioTipoSonido;
        public TipSoundController(IRepositorioTipoSonido repositorioTipoSonido)
        {
            _repositorioTipoSonido = repositorioTipoSonido;
        }
        public IActionResult _TipSounds()
        {
            var tiposSonidos = _repositorioTipoSonido.ListarTodos();
            var model = tiposSonidos.Select(s => new TipSoundModel
            {
                Id = s.Id,
                Tipo = s.Tipo,
                Nombre_ES = s.Nombre_ES,
            });

            return PartialView(model);
        }
    }
}
这是“部分视图”\u Sounds,它显示了一个列表,其中列出了@foreach问题所在的声音和声音类型。好像它是空的

@model IEnumerable<Local.Web.Models.SoundModel>
@{
    if (ViewData.TryGetValue("ParentLayout", out var parentLayout))
    {
        Layout = (string)parentLayout;
    }
    else
    {
        Layout = "/Views/Shared/_Layout.cshtml";
    }
}


<table class="table table-responsive table-striped table-bordered">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.sound.Id)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.sound.Nombre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.sound.Tipo)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.tipSound.Nombre_ES)
            </th>
        </tr>
    </thead>
    <tbody>

        @foreach (var item in Model)  // This is the ERROR line
        {
        <tr>
            <td>
                @item.sound.Id
            </td>
            <td>
                @item.sound.Nombre
            </td>
            <td>
                @item.sound.Tipo
            </td>
            <td>
                @item.tipSound.Nombre_ES
            </td>
        </tr>
        }

    </tbody>
</table>
@model IEnumerable
@{
if(ViewData.TryGetValue(“ParentLayout”,out var ParentLayout))
{
布局=(字符串)parentLayout;
}
其他的
{
Layout=“/Views/Shared/_Layout.cshtml”;
}
}
@DisplayNameFor(model=>model.sound.Id)
@DisplayNameFor(model=>model.sound.Nombre)
@DisplayNameFor(model=>model.sound.Tipo)
@DisplayNameFor(model=>model.tipSound.NombreèES)
@foreach(模型中的var项)//这是错误行
{
@item.sound.Id
@item.sound.Nombre
@item.sound.Tipo
@item.tipSound.Nombre_ES
}
如果我隐藏foreach部分并运行它,那么表标题@Html.DisplayNameFor(model=>model.sound…)将正确读取和显示。如果我离开foreach,它会给我典型的System.NullReferenceException错误:“对象引用未设置为对象的实例。”指向foreach行


有人能指导我吗,因为如果我在他们的视图中显示每个模型,它工作得很好,但是当我在同一视图中显示两个模型的一部分时,它就失败了。

您需要使用类型
List
将数据传递到部分视图。因此您需要更改

@model Local.Web.Models.SoundModel

@model IEnumerable
索引视图中。 然后,您需要在索引操作中传递一个列表。(我传递一个新列表以进行测试,您还可以传递类型为
list
的其他数据)

public IActionResult Index()
{
返回视图(新列表());
}
结果:
可能我没有正确解释自己。
在做出由Yiyi You评论的修改后

  • 索引视图中将
    @model Local.Web.Models.SoundModel
    更改为
    @model IEnumerable
  • 然后,我放置
    返回视图(newlist())IActionResult Index()
    中的code>
  • 因此,System.NullReferenceException错误已消失,但工作不正常

    它只显示数据库记录的名称,但不显示应使用
    foreach(模型中的var项)读取的数据库记录的内容

    这就是它所显示的:

    但它应该表明:

    谢谢您的快速回复,Yiyi You,我已经做了更改,现在它没有给出错误,但它不能正常工作。foreach清单@item.soun.Id、@item.tipSound。。。没有出现。仅显示@Html.DisplayNameFor的标题。(Id、名称、类型和名称)。是的,如果您想在Index.cshtml中使用
    ,您需要在索引操作中传递列表,如我在回答中所示。我的演示程序正在传递一个新列表()以查看,因此不会显示任何数据,您可以将数据传递给查看。我已经进行了更改。我已经将新列表()放在index.cshtml中,但它仍然不起作用。数据库中有30多条记录。如果我从一个模型到一个视图直接得到一个列表,它会正常工作,并显示记录的名称和记录列表,但是在这个解决方案中,我必须在一个视图中显示两个模型的列表,它只显示记录的名称,就像您添加的结果照片一样。但是数据库中的记录列表没有显示它们。我不明白发生了什么。就好像模型是空的。您只使用了一次
    ,所以它只会显示一个列表。可能我没有正确解释自己。只会显示每条记录的Html.DisplayNameFor,但带有foreach的@items的列表不会显示在表中,并且必须显示所有记录的列表。
    public IActionResult Index()
            {
                return View(new List<SoundModel>());
            }