我有一个视图显示数据库中的所有帖子。我需要创建一个局部视图,其中包含前 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 将数据传递到分部视图中。我尝试了一些(愚蠢的)方法,但它们没有用。请指导我,如果我的代码有任何问题,请帮助我修复它。
尝试按如下方式更改您的代码: 为结果创建一个类:
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
动作方法了。
您将 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>
}