无效操作异常:传入 ViewDataDictionary 的模型项属于类型
Invalid Operation Exception: The model item passed into the ViewDataDictionary is of type
当我将 Type Model 的 table(Tips) 中的数据列为 partialView 时出现此错误。
InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'System.Collections.Generic.List1[RealEstateAspNetCore3._1.Models.Advertisement]', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable
1[RealEstateAspNetCore3._1.Models.Tip]'.
table Tip
(类型)包含 StatusId
作为外键。
Tip.cs 型号 class:
[Key]
public int TypeId { get; set; }
public string TypeName { get; set; }
public int StatusId { get; set; }
public virtual Status Status { get; set; }
Status.cs
[Key]
public int StatusId { get; set; }
public string StatusName { get; set; }
public List<Tip> Tips { get; set; }
advertisement.cs
[Key]
public int AdvId { get; set; }
public string Description { get; set; }
public int StatusId { get; set; }
public int TypeId { get; set; }
[ForeignKey("TypeId")]
public Tip Tip { get; set; }
家庭控制器
public PartialViewResult StatusName1()
{
string statusname1 = _context.Tips.Where(i => i.StatusId == 1)
.FirstOrDefault()
.ToString();
return PartialView(statusname1);
}
部分视图 StatusName1:
@model RealEstateAspNetCore3._1.Models.Tip
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button">
@Model.Status.StatusName <span class="caret"></span> </a>
Index.cshtml
在索引中我列出了广告 tables 并且效果很好,我使用了如下模型
@model IEnumerable<RealEstateAspNetCore3._1.Models.Advertisement>
在我像这样调用上面的部分 RenderBoy 之后在布局中出现错误
<partial name="StatusName1" />
我花了两天时间试图解决这个问题,但错误仍然存在。
谢谢
我假设你的部分视图名称是 StatusName1
像下面这样更改您的代码:-
public IActionResult StatusName1()
{
var status1 = _context.Tips.Where(i => i.StatusId == 1)
.FirstOrDefault();
return PartialView("StatusName1",status1);
}
它将解决您的问题。
更新
在 MVC 核心中您需要使用 ViewComponent 而不是部分视图。
创建一个名为 Components
的文件夹 class 必须继承自 ViewComponent。我会给这个组件class name CategoryWiseMenu
namespace DigitalShop.Components
{
public class CategoryWiseMenu:ViewComponent
{
private readonly ApplicationDbContext _db;
public CategoryWiseMenu(ApplicationDbContext db)
{
_db = db;
}
public IViewComponentResult Invoke()
{
var c = _db.Tips.Where(i => i.StatusId == 1)
.FirstOrDefault();
return View("Default.cshtml",c);
}
}
}
~/Views/Shared/Components/Default.cshtml
像上面的路径一样在 Components 文件夹中创建 Default.cshtml
。
演示Default.cshtml
<ul class="navbar-nav flex-grow-1">
@foreach (var rr in Model)
{
<li class="nav-item text-dark">
<a asp-controller="" asp-action=""
class="nav-link text-dark">@rr.TypeName</a>
</li>
}
</ul>
现在在您的布局页面中包含以下代码。
@await Component.InvokeAsync("CategoryWiseMenu")
现在它可以正常工作了。
如果您在需要引用视图的完整路径时从 _Layout.cshtml 调用局部视图:
<partial name="~/Views/Home/StatusName1.cshtml" />
将 Views/Home 替换为项目中的任何文件夹名称。在此处查看更多信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/partial?view=aspnetcore-5.0#partial-tag-helper
你提供的片段中有模型和一大堆其他问题 - 我认为@pritom-sarkar 的回答已经解决了大部分问题
当我将 Type Model 的 table(Tips) 中的数据列为 partialView 时出现此错误。
InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'System.Collections.Generic.List
1[RealEstateAspNetCore3._1.Models.Advertisement]', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable
1[RealEstateAspNetCore3._1.Models.Tip]'.
table Tip
(类型)包含 StatusId
作为外键。
Tip.cs 型号 class:
[Key]
public int TypeId { get; set; }
public string TypeName { get; set; }
public int StatusId { get; set; }
public virtual Status Status { get; set; }
Status.cs
[Key]
public int StatusId { get; set; }
public string StatusName { get; set; }
public List<Tip> Tips { get; set; }
advertisement.cs
[Key]
public int AdvId { get; set; }
public string Description { get; set; }
public int StatusId { get; set; }
public int TypeId { get; set; }
[ForeignKey("TypeId")]
public Tip Tip { get; set; }
家庭控制器
public PartialViewResult StatusName1()
{
string statusname1 = _context.Tips.Where(i => i.StatusId == 1)
.FirstOrDefault()
.ToString();
return PartialView(statusname1);
}
部分视图 StatusName1:
@model RealEstateAspNetCore3._1.Models.Tip
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button">
@Model.Status.StatusName <span class="caret"></span> </a>
Index.cshtml
在索引中我列出了广告 tables 并且效果很好,我使用了如下模型
@model IEnumerable<RealEstateAspNetCore3._1.Models.Advertisement>
在我像这样调用上面的部分 RenderBoy 之后在布局中出现错误
<partial name="StatusName1" />
我花了两天时间试图解决这个问题,但错误仍然存在。
谢谢
我假设你的部分视图名称是 StatusName1
像下面这样更改您的代码:-
public IActionResult StatusName1()
{
var status1 = _context.Tips.Where(i => i.StatusId == 1)
.FirstOrDefault();
return PartialView("StatusName1",status1);
}
它将解决您的问题。
更新
在 MVC 核心中您需要使用 ViewComponent 而不是部分视图。
创建一个名为 Components
的文件夹 class 必须继承自 ViewComponent。我会给这个组件class name CategoryWiseMenu
namespace DigitalShop.Components
{
public class CategoryWiseMenu:ViewComponent
{
private readonly ApplicationDbContext _db;
public CategoryWiseMenu(ApplicationDbContext db)
{
_db = db;
}
public IViewComponentResult Invoke()
{
var c = _db.Tips.Where(i => i.StatusId == 1)
.FirstOrDefault();
return View("Default.cshtml",c);
}
}
}
~/Views/Shared/Components/Default.cshtml
像上面的路径一样在 Components 文件夹中创建 Default.cshtml
。
演示Default.cshtml
<ul class="navbar-nav flex-grow-1">
@foreach (var rr in Model)
{
<li class="nav-item text-dark">
<a asp-controller="" asp-action=""
class="nav-link text-dark">@rr.TypeName</a>
</li>
}
</ul>
现在在您的布局页面中包含以下代码。
@await Component.InvokeAsync("CategoryWiseMenu")
现在它可以正常工作了。
如果您在需要引用视图的完整路径时从 _Layout.cshtml 调用局部视图:
<partial name="~/Views/Home/StatusName1.cshtml" />
将 Views/Home 替换为项目中的任何文件夹名称。在此处查看更多信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/partial?view=aspnetcore-5.0#partial-tag-helper
你提供的片段中有模型和一大堆其他问题 - 我认为@pritom-sarkar 的回答已经解决了大部分问题