如何在局部视图中使用 ViewBag 传递列表的值?

问题描述 投票:0回答:2

我有一个视图显示数据库中的所有帖子。我需要创建一个局部视图,其中包含前 5 个查看次数最多的帖子。

这是我的 PostController 控制器:

public class PostController : Controller
    {
        private readonly IUnitOfWork uow;

        public PostController(IUnitOfWork uow)
        {
            this.uow = uow;
        }

        public IActionResult Index()
        {
            var result = uow._post.GetAll().ToList();
            return View(result);
        }

        public IActionResult GetMostViewedPost()
        {
            var result = uow._post.GetMostViewedPost(5).ToList();
            ViewBag.MostViewedPost = result;
            return PartialView(result);
        }
    }

我的局部观点:

<h3>Most Viewed Posts</h3>
@foreach (var post in ViewBag)
{
    <!-- Post preview-->
    <div class="post-preview">
        <h4 class="post-title">@post.Title</h4>
        <h5 class="post-subtitle" style="font-weight:200">@post.ShortDescription</h5>
        <p class="post-meta">
            Posted on @post.PostedOn
        </p>
    </div>
}

我正在使用 ViewBag 将数据传递到分部视图中。我尝试了一些(愚蠢的)方法,但它们没有用。请指导我,如果我的代码有任何问题,请帮助我修复它。

c# asp.net-mvc viewbag viewdata
2个回答
0
投票

尝试按如下方式更改您的代码: 为结果创建一个类:

public class Result 
{
    public List<Post> Posts{get;set;}
    public List<Post> MostViewedPost {get;set;}
}

改变你的行动方式:

  public IActionResult Index()
    {
        var result=new Result();
         
        result.Posts = uow._post.GetAll().ToList();
        result.MostViewedPost=uow._post.GetMostViewedPost(5).ToList();
        return View(result);
    }

在您的

index.cshtml
文件中添加以下行(用您的代码替换...):

@model Result
...
 @{await Html.RenderPartialAsync("Your PartialView name",Result.MostViewedResult)}
...

你不再需要

GetMostViewedPost
动作方法了。


0
投票

您将 5 个最受欢迎的帖子的值分配给

ViewBag.MostViewedPost
属性,但是在您的
View
中您不是从
ViewBag.MostViewedPost
属性读取,而是从整个
ViewBag
读取。正确的代码应该是这样的:

<h3>Most Viewed Posts</h3>
@foreach (var post in ViewBag.MostViewedPost)
{
    <!-- Post preview-->
    <div class="post-preview">
        <h4 class="post-title">@post.Title</h4>
        <h5 class="post-subtitle" style="font-weight:200">@post.ShortDescription</h5>
        <p class="post-meta">
            Posted on @post.PostedOn
        </p>
    </div>
}

您还应该确保使用下一个代码在主视图中渲染局部视图

@Html.Partial("GetMostViewedPost")

请注意,这是一个快速的解决方案,最好在您的视图(包括局部视图)中使用strongly typed

model

@model 指令指定传递给视图或页面的模型类型。 Razor 公开了一个模型属性,用于访问传递给视图的模型。

只需更新您的

GetMostViewedPost
方法:

public IActionResult GetMostViewedPost()
{
    var result = uow._post.GetMostViewedPost(5).ToList();
    return PartialView(result);
}

然后使用

@model
语法声明一个模型类型:

@model List<Post> 

<h3>Most Viewed Posts</h3>
@foreach (var post in Model)
{
    <!-- Post preview-->
    <div class="post-preview">
        <h4 class="post-title">@post.Title</h4>
        <h5 class="post-subtitle" style="font-weight:200">@post.ShortDescription</h5>
        <p class="post-meta">
            Posted on @post.PostedOn
        </p>
    </div>
}
© www.soinside.com 2019 - 2024. All rights reserved.