转换ActionResult和PartialView IEnumerable结果返回json对象
本文关键字:返回 json 对象 结果 IEnumerable ActionResult PartialView 转换 | 更新日期: 2023-09-27 18:01:20
当将基本的ActionResult
转换为JSON
对象并在PartialView
中渲染它们时,最好的方法是什么?我的目标是修改应用程序,使页面在页面请求时仅呈现db中的评论,而不是呈现一种数据服务类型,该类型的数据服务更新PartialView
以添加自上次页面请求以来可能已发布的任何传入评论。我认为我正在寻找的解决方案将使用json
格式的OData
,然后使用knockout.js
绑定该数据,但不确定。
这是控制器ActionResult
,它从存储库返回IEnumerable
对象列表到PartialView
:
[ChildActionOnly]
public ActionResult GetCommentsById(int AId = 0)
{
if (AId == 0)
return HttpNotFound();
return PartialView("_CommentsPartial",
_unitOfWork.ArticleRepository.GetCommentsByArticleId(AId));
}
下面是PartialView
的一个片段,以保持简短:
@model IEnumerable<BlogSite.Models.Comment>
@using BlogSite.Helpers;
<ul id="comments-list">
@{
foreach (var comment in Model)
{
<!--Grabs Parent Comment and then all replies w/ParentCommentId b4 grabs new Parent Comment -->
if (comment.isRoot && comment.ParentCommentId == null)
{
<!-- Comment -->
int counter = 0; foreach (var c in Model) { if (c.ParentCommentId == comment.CommentId) { counter += 1; } }
<li id="@comment.CommentId" itemscope itemtype="http://schema.org/UserComments" class="comment-container" tabindex="@comment.CommentId">
然后我从Details视图调用它:
<div id="comments-panel" class="panel-box">
<div class="show-comments"><div id="upNdown"></div><span id="showNhide">Show Comments</span></div><br /> <br />
<div id="comments-partial" style="display:none;">
@Html.Action("AddComment", "Comment", new { AId = Model.ArticleId })
@Html.Action("GetCommentsById", "Article", new { AId = Model.ArticleId })
</div>
</div>
我怎样才能使这种转换尽可能地轻松?提前感谢!
我想我从你的问题中收集到控制器已经完成了它的工作,你只是想"消费"它的数据输出,就好像它是使用相同js代码的AJAX请求一样。只需使用Newtonsoft Json序列化模型中的数据,就可以相当容易地做到这一点。. NET api和由Forloop.HtmlHelpers提供的扩展。如果你还没有安装这些nuget包,可以把它们作为nuget包安装。
首先,你要把它放在你的局部视图
注意:如果你不想安装Newtonsoft软件包,你可以用System.Web.Helpers方法 Json.Encode
JsonConvert.SerializeObject
@{
using (var context = Html.BeginScriptContext())
{
Html.AddScriptBlock("var jsonData=" + JsonConvert.SerializeObject(Model) + ";");
}
}
然后在你的布局页面中,为了确保你的脚本块在适当的时间呈现,将这个调用添加到Html.RenderScripts
@Scripts.Render("~/bundles/jquery")
@*Add any other dependency scripts*@
@Html.RenderScripts()
@RenderSection("scripts", required: false)
这就是为什么你需要Forloop。HtmlHelpers包,这些扩展方法有助于减少无序脚本代码在jQuery或其他任何东西启动之前在部分视图中呈现。
希望有帮助