.net 有人知道为什么在一个视图中显示来自两个模型的数据的foreach(模型中的var项)会出现错误吗?
我有两个不同的模型,它们的控制器连接在一个模型中,然后在从另一个索引ASP.NET Core 5视图调用的单个局部视图中显示它 这是主索引视图.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
@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>
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>());
}