当我在普通视图中调用部分视图时,出现此错误; InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为“System.String”,但此 ViewDataDictionary 实例需要类型为“System.Collections.Generic.List`1[EntityLayer.Concrete.Content]”的模型项。
默认控制器.cs
using BusinessLayer.Concrete;
using DataAccesLayer.Concrete;
using DataAccesLayer.EntityFramework;
using Microsoft.AspNetCore.Mvc;
using EntityLayer.Concrete;
using Microsoft.AspNetCore.Authorization;
namespace MvcCamp.Controllers
{
[AllowAnonymous]
public class DefaultController : Controller
{
HeadingManager headingManager = new HeadingManager(new EfHeadingDal(new Context()));
ContentManager contentManager = new ContentManager(new EfContentDal(new Context()));
public IActionResult Headings()
{
var headingList = headingManager.GetList();
ViewBag.ContentList = contentManager.GetList();
return View(headingList);
}
public PartialViewResult Index(int id = 0)
{
var contentList = contentManager.GetListByHeadingId(id); // Fetches content filtered by heading ID
return PartialView(contentList);
}
}
}
标题.cshtml
@model List<EntityLayer.Concrete.Heading>
@using EntityLayer.Concrete
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Admin Dashboard</title>
<!-- Font Awesome Icons -->
<link rel="stylesheet" href="/AdminLTE-3.0.4/plugins/fontawesome-free/css/all.min.css">
<!-- IonIcons -->
<link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="/AdminLTE-3.0.4/dist/css/adminlte.min.css">
<!-- Google Font: Source Sans Pro -->
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
</head>
<body class="hold-transition sidebar-mini">
<div class="wrapper">
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<div class="sidebar">
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="info">
<a href="#" class="d-block">MVC Yazar Paneli</a>
</div>
</div>
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<img src="/AdminLTE-3.0.4/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image">
</div>
<div class="info">
<a href="#" class="d-block">Alexander Pierce</a>
</div>
</div>
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
@foreach (var item in Model)
{
<li class="nav-item">
<a href="javascript:void(0);" onclick="loadContent(@item.HeadingID)" class="nav-link">
<p>@(item.HeadingName.Length > 25 ? item.HeadingName.Substring(0, 25) + "..." : item.HeadingName)</p>
</a>
</li>
}
</ul>
</nav>
</div>
</aside>
<div class="content-wrapper">
<div class="content" id="dynamicContent">
@Html.Partial("~/Views/Default/Index.cshtml", "Default")
</div>
</div>
</div>
<script src="/AdminLTE-3.0.4/plugins/jquery/jquery.min.js"></script>
<script src="/AdminLTE-3.0.4/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="/AdminLTE-3.0.4/dist/js/adminlte.js"></script>
<script>
function loadContent(headingId) {
$.ajax({
url: '@Url.Action("Index", "Default")',
type: 'GET',
data: { id: headingId },
success: function (data) {
$('#dynamicContent').html(data);
},
error: function () {
alert('Error loading content.');
}
});
}
</script>
<!-- Other scripts -->
</body>
</html>
Index.cshtml(部分)
@model List<EntityLayer.Concrete.Content>
<!DOCTYPE html>
<html>
<body class="hold-transition sidebar-mini">
<!-- Site wrapper -->
<div class="wrapper">
<section class="content">
<div class="container-fluid">
<!-- Timelime example -->
<div class="row">
<div class="col-md-12">
<!-- The time line -->
<div class="timeline">
<!-- timeline time label -->
@foreach (var item in Model)
{
if (item != null)
{
<br />
<div class="time-label">
<span class="bg-success"> @item.ContentDate.ToString("dd-MMM-yyyy") - @item.Writer.WriterName @item.Writer.WriterSurName</span>
</div>
<!-- /.timeline-label -->
<!-- timeline item -->
<div>
<i class="fas fa-comment bg-yellow"></i>
<div class="timeline-item">
<h3 class="timeline-header">
<a href="#">
@item.Heading.HeadingName
</a>
</h3>
<div class="timeline-body">
@item.ContentValue
</div>
</div>
</div>
}
}
<!-- END timeline item -->
</div>
</div>
<!-- /.col -->
</div>
</div>
<!-- /.timeline -->
</section>
<!-- /.content -->
</div>
<!-- ./wrapper -->
</body>
</html>
我尝试了不同的东西,例如javascriot功能,尝试添加viewBag,但它没有按我预期的方式工作
从代码中可以看出,您使用 Model 传输数据,而不是 ViewBag。
在两个视图(部分和子布局)的开头都写着:
@型号列表
所以能够以模型的形式传递的信息的数据类型应该是List
也就是说,你的控制器中的headingList和contentList都必须有上述类型的信息。
问题可能出在 contentManager.GetListByHeadingId(id) 函数中,该函数可能不会返回 EntityLayer.Concrete.Content 类型的列表。