转换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>

我怎样才能使这种转换尽可能地轻松?提前感谢!

转换ActionResult和PartialView IEnumerable结果返回json对象

我想我从你的问题中收集到控制器已经完成了它的工作,你只是想"消费"它的数据输出,就好像它是使用相同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或其他任何东西启动之前在部分视图中呈现。

希望有帮助