MVC 3 - 如何从动作方法返回显示模板?

时间:2011-03-17 18:09:59

标签: c# jquery asp.net-mvc asp.net-mvc-3 razor

我有一个显示评论列表的视图。它通过DisplayTemplate完成此操作。我所要做的就是@Html.DisplayFor(x => x.BlogPost.PostComments),所有的评论都会正确呈现。

页面底部有一个表单可添加新评论。此页面使用渐进增强功能。因此,如果禁用了javascript,则表单会像正常一样提交,将注释添加到数据库,然后重定向到呈现博客帖子的操作。但是,如果javascript可用,那么jQuery会劫持表单的提交并通过ajax发布帖子。好吧,因为注释标记在显示模板中,我不知道如何从action方法返回它,以便jQuery可以将它放在页面上。

我知道如何使用部分视图执行此操作。我只是让action方法返回正确的局部视图,jquery会将响应附加到页面上的注释容器中。

在我删除我的显示模板以支持部分视图之前,是否有一种直接的方法让我从控制器发回显示模板?

这是我的行动方法:

    public ActionResult AddComment(PostComment postComment)
    {
        postComment.PostedDate = DateTime.Now;
        postCommentRepo.AddPostComment(postComment);
        postCommentRepo.SaveChanges();
        if (Request.IsAjaxRequest())
            return ???????
        else
            return RedirectToAction("BlogPost", new { Id = postComment.BlogPostID });
    }

当页面加载时,不需要担心它,因为它以标准方式使用模板:

<div class="comments">
    @Html.DisplayFor(x => x.BlogPost.BlogPostComments)
</div>

我只是想知道如何将一个使用显示模板的评论发送回jQuery。

3 个答案:

答案 0 :(得分:11)

您可以尝试返回代表新发布的评论的部分HTML:

if (Request.IsAjaxRequest())
{
    return PartialView(
        "~/Views/Shared/DisplayTemplates/Comment.cshtml", 
        postComment
    );
}

并在客户端将此注释附加到评论容器:

$.post('@Url.Action("AddComment")', { ... }, function (result) {
    $('#comments').append(result);

    // or $('#comments').prepend(result); if you want it to appear on top
});

答案 1 :(得分:2)

this question能否为您提供所需内容?似乎表明您可以通过操作调用HTML帮助程序。

答案 2 :(得分:0)

使用以下剃刀代码创建部分视图/Shared/DisplayTemplate.cshtml:

@Html.DisplayFor(m => Model)

然后在您的控制器中(或者最好在基本控制器类中)添加一个方法:

protected PartialViewResult PartialViewFor(object model)
{
    return PartialView("DisplayTemplate",model);
}

在OP的情况下:

public ActionResult AddComment(PostComment postComment)
{
    postComment.PostedDate = DateTime.Now;
    postCommentRepo.AddPostComment(postComment);
    postCommentRepo.SaveChanges();
    if (Request.IsAjaxRequest())
        return PartialViewFor(postComment);
    else
        return RedirectToAction("BlogPost", new { Id = postComment.BlogPostID });
}