Вернуть результат другого действия в виде строки

На своем веб-сайте MVC я создаю небольшой форум. Для одного сообщения я визуализирую свое действие «Отдельное сообщение (сообщение)» в моем «Контроллере PostController», как показано ниже.

<% Html.RenderAction<PostController>(p => p.Single(comment)); %>

Также, когда пользователь отвечает на сообщение, я отправляю ответ в виде запроса ajax на свое действие CreatePost, а затем возвращаю представление «Single» в результате этого действия, как показано ниже.

public ActionResult CreatePostForForum(Post post)
{
    //Saving post to DB
    return View("Single", postViewData);
}

Когда мне нравится, что визуализируется только представление, коды в теле "Single" Action не выполняются.

Как лучше всего это сделать?

Также я хочу вернуть результат действия "Single" в виде строки в моем JsonObject, как показано ниже.

return Json(new{IsSuccess = true; Content= /*HERE I NEED Single actions result*/});

person Yucel    schedule 14.03.2011    source источник


Ответы (2)


Вы можете использовать что-то подобное, но будьте с этим очень осторожны. На самом деле это может вызвать плохо отслеживаемые ошибки (например, когда вы забыли явно указать имя представления в методе Single).

public ActionResult Single(PostModel model) {
    // it is important to explicitly define which view we should use
    return View("Single", model);
}

public ActionResult Create(PostModel model) {

    // .. save to database ..

    return Single(model);
}

Более чистым решением было бы сделать то же самое, как если бы оно было отправлено из стандартной формы - перенаправление (за ним последует XMLHttpRequest)

Для возврата представлений ajax, завернутых в json, я использую следующий класс

public class AjaxViewResult : ViewResult
{
    public AjaxViewResult()
    {

    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (!context.HttpContext.Request.IsAjaxRequest())
        {
            base.ExecuteResult(context);
            return;
        }

        var response = context.HttpContext.Response;

        response.ContentType = "application/json";

        using (var writer = new StringWriter())
        {
            var oldWriter = response.Output;
            response.Output = writer;
            try
            {
                base.ExecuteResult(context);
            }
            finally
            {
                response.Output = oldWriter;
            }

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            response.Write(serializer.Serialize(new
            {
                action = "replace",
                html = writer.ToString()
            }));
        }
    }
}

Это, наверное, не лучшее решение, но работает неплохо. Обратите внимание, что вам нужно будет вручную установить свойства View, ViewData.Model, ViewData, MasterName и TempData.

person Lukáš Novotný    schedule 14.03.2011

Моя рекомендация:

  • Отправьте свой ответ на форум (и любые другие варианты) через Ajax.
  • Верните свой JSONResult, используя этот метод: ASP MVC View Content как JSON для рендеринга ваш контент.
  • В обработчике OnSuccess вашего вызова ajax проверьте, истинно ли значение IsSuccess. В случае успеха добавьте содержимое в соответствующий контейнер с помощью JQuery.
person Keith    schedule 14.03.2011