Asp.net MVC: отправить обратно HTML внутри объекта Json - PullRequest
5 голосов
/ 22 ноября 2011

Я хочу вернуть html внутри моего объекта json, но это не похоже на мой код:

return new JsonResult()
{
 Data = new { Error = false, NewComment = PartialView("Review/InlineCommentUC", dto) }
};

Я хочу, чтобы в NewComment был какой-то html ...

Что я получаю (используя firebug) для объекта NewComment в формате json:

TempData = []
View = null,
ViewData = []
ViewEngineCollection = some data..
ViewName = name of view

Я использую Jquery для рендеринга вывода в html, причина для отправки обратно объекта json заключается в том, что я очень легко могу обработать свои ошибки.

В идеале custom Результат действия - это то, что я ищу ...

Ответы [ 2 ]

5 голосов
/ 22 ноября 2011

Является ли http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/ тем, что вы ищете?

Скопировано с помощью WayBackMachine.

Я столкнулся с ситуацией, в которой я хотел бы визуализировать частичное представление строки, а затем вернуть его как часть ответа JSON, например:

return Json(new {
    statusCode = 1,
    statusMessage = "The person has been added!",
    personHtml = PartialView("Person", person)
});

Возможность сделать что-то подобное открыла бы массу удивительных возможностей, поэтому я действительно искал интернет, ища решение. К сожалению, кажется, никто не придумал чистого решения для этого, поэтому я копался в коде MVC и придумал один… и, поскольку я такой хороший парень, вы можете скопировать его бесплатно. ;)

public abstract class MyBaseController : Controller {

    protected string RenderPartialViewToString()
    {
        return RenderPartialViewToString(null, null);
    }

    protected string RenderPartialViewToString(string viewName)
    {
        return RenderPartialViewToString(viewName, null);
    }

    protected string RenderPartialViewToString(object model)
    {
        return RenderPartialViewToString(null, model);
    }

    protected string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter()) {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }
}

Теперь вы можете просто сделать это:

public class MyController : MyBaseController {

    public ActionResult CreatePerson(Person p) {
        if (ModelState.IsValid) {
            try {
                PersonRepository.Create(p);
                return Json(new {
                    statusCode = 1,
                    statusMessage = "The person has been added!",
                    personHtml = RenderPartialViewToString("Person", p)
                });
            }
            catch (Exception ex) {
                return Json(new {
                    statusCode = 0,
                    statusMessage = "Error: " + ex.Message
                });
            }
        }
        else
            return Json(new {
                statusCode = 0,
                statusMessage = "Invalid data!"
            });
    }
}

Также обратите внимание, что вы можете изменить эти функции для рендеринга View (а не PartialView) с этим небольшим изменением:

ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName);

Наслаждайтесь!

1 голос
/ 22 ноября 2011

PartialView возвращает PartialViewResult документов , и это то, что кодируется в JSON.

Посмотрите на http://forums.asp.net/post/3761391.aspx, как отобразить PartialView в строку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...