MVC 3 - Как вы возвращаете шаблон отображения из метода действия? - PullRequest
9 голосов
/ 17 марта 2011

У меня есть вид, который отображает список комментариев. Это делается через DisplayTemplate. Все, что мне нужно сделать, это что-то вроде @Html.DisplayFor(x => x.BlogPost.PostComments), и все комментарии отображаются соответствующим образом.

Внизу страницы есть форма для добавления нового комментария. Эта страница использует прогрессивное улучшение. Таким образом, если javascript отключен, то форма отправляется как обычно, добавляет комментарий в базу данных, а затем перенаправляет на действие, которое отображает сообщение в блоге. Однако, если javascript доступен, то jQuery захватывает отправку формы и отправляет сообщение через ajax. Ну, поскольку разметка комментария находится в шаблоне отображения, я не знаю, как вернуть его из метода действия, чтобы jQuery мог отбросить его на странице.

Я знаю, как сделать это с частичным представлением. Мне просто нужно, чтобы метод действия вернул правильное частичное представление, а 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 ]

11 голосов
/ 17 марта 2011

Вы можете попытаться вернуть частичный 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
});
2 голосов
/ 17 марта 2011

дает ли этот вопрос то, что вы ищете? Похоже, что вы можете вызвать помощника HTML из действия.

0 голосов
/ 29 марта 2011

Создайте частичное представление /Shared/DisplayTemplate.cshtml со следующим кодом бритвы:

@Html.DisplayFor(m => Model)

Затем в вашем контроллере (или, предпочтительно, в базовом классе контроллеров) добавьте метод по этим строкам:

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

В случае ОП:

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 });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...