我有一个显示评论列表的视图。它通过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。
答案 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 });
}