如何通过ViewBag将列表值传入ASP.NET Core分部视图?
实现步骤
1. 修改PostController的Index方法
在Index方法中,除了获取所有文章,同时把5篇最高浏览量的文章存入ViewBag:
public IActionResult Index() { var allPosts = uow._post.GetAll().ToList(); // 将热门文章数据存入ViewBag ViewBag.MostViewedPosts = uow._post.GetMostViewedPost(5).ToList(); return View(allPosts); }
2. 创建分部视图
在Views/Post文件夹下新建名为_MostViewedPosts.cshtml的分部视图,代码如下:
@using FA.JustBlog.Core.Models; @model IList<Post> <div class="col-md-3"> <h3 class="mb-4">浏览量最高的文章</h3> <div class="list-group"> @foreach (var post in Model) { <a href="@Url.Action("Details", "Post", new { id = post.Id })" class="list-group-item list-group-item-action"> <h5 class="mb-1">@post.Title</h5> <p class="mb-1 small">浏览量: @post.ViewCount</p> </a> } </div> </div>
可根据实际UI需求调整HTML结构和样式,比如修改卡片样式、显示字段等。
3. 在Index视图中引用分部视图
修改Index.cshtml,调整页面布局为两栏结构,并渲染分部视图:
@using FA.JustBlog.Core.Models; @model IList<Post>; <div class="row gx-4 g-lg-5 justify-content-center"> <!-- 主内容区:所有文章列表 --> <div class="col-md-9"> <!-- Post preview--> @foreach(var item in Model) { <div class="post-preview"> <a href="@Url.Action("Details", "Post", new {id = item.Id })"> <h2 class="post-title">@item.Title</h2> <h3 class="post-subtitle">@item.ShortDescription</h3> </a> <p class="post-meta"> Posted by <a href="@Url.Action("Details", "Post", new {id = item.Id })">JustBlog</a> on @item.PostedOn </p> </div> <!-- Divider--> <hr class="my-4" /> } <!-- Pager--> <div class="d-flex justify-content-end mb-4"><a class="btn btn-primary text-uppercase" href="#!">Older Posts →</a></div> </div> <!-- 侧边栏:热门文章分部视图 --> @if (ViewBag.MostViewedPosts != null && ViewBag.MostViewedPosts.Any()) { @Html.Partial("_MostViewedPosts", ViewBag.MostViewedPosts) } </div>
通过@Html.Partial传递ViewBag中的数据给分部视图,添加空值判断避免数据为空时出现错误。
备选方案:使用独立Action渲染分部视图
如果希望通过独立Action加载热门文章,可保留原GetMostViewedPost方法,直接在Index视图中调用:
<!-- 在Index视图合适位置添加 --> @Html.Action("GetMostViewedPost")
这种方式会触发服务器端调用该Action并返回分部视图内容。
内容的提问来源于stack exchange,提问作者sos.call.112
相关产品推荐
相关产品推荐

