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

时间:2014-05-03 00:49:30

标签: c# asp.net-mvc json razor asp.net-mvc-partialview

将基本ActionResult转换为JSON个对象并将其呈现在PartialView时,最佳方法是什么?我的目标是修改应用程序,以便在页面请求时,只将页面中的注释呈现给更新PartialView的数据服务类型以添加​​任何可能已有的传入注释。自上一页请求以来发布。我认为我要寻找的解决方案将以OData格式使用json,然后使用knockout.js绑定该数据,但不确定。

这是Controller 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">

然后我从详细信息视图中调用它:

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

如何让这种转换尽可能轻松?提前谢谢!

1 个答案:

答案 0 :(得分:1)

我想我从你的问题中得知控制器已经完成了它的工作,而你只是想“消耗”它的数据输出,好像它是一个使用相同js代码的AJAX请求。只需使用Newtonsoft Json.NET提供的Forloop.HtmlHelpers api和扩展序列化模型中的数据,即可轻松完成此操作。如果您还没有这些,可以将它们安装为nuget包。

首先,您可以将其置于局部视图中 注意:如果您不想安装Newtonsoft软件包,可以使用System.Web.Helpers方法替换 JsonConvert.SerializeObject Json.Encode

@{
    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或其他任何东西启动之前在局部视图中呈现的无序脚本代码。

希望有所帮助