Визуализация частичного представления строки путем вызова метода действия - PullRequest
1 голос
/ 20 марта 2012

Я экспериментировал с рендерингом представления в строку, используя методы, описанные здесь:

Визуализация представления в виде строки

Проблема в том, что мне нужновызовите действие моего контроллера, которое не происходит при вызове View.Render.

var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
viewResult.View.Render(viewContext, sw);

Мой вопрос: как я могу вызвать RenderAction на произвольном контроллере, проходящем по маршруту?Я пытаюсь объединить результаты нескольких частичных представлений в один результат, который будет передан обратно в браузер.

Пока мой код.Работает за исключением того, что метод действия не вызывается.

    public static string RenderPartialViewToString(this Controller controller, string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = controller.ControllerContext.RouteData.GetRequiredString("action");

        controller.ViewData.Model = model;

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

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



        var route = new RouteData();
        route.Values.Add("controller", "Test1");
        route.Values.Add("action", "Index");

        var controller1 = new Test1Controller();

        var controllerContext = new ControllerContext(new RequestContext(this.ControllerContext.HttpContext, route), controller1);
        controller1.ControllerContext = controllerContext;
        var viewString = controller1.RenderPartialViewToString("~/Views/Test1/Index.cshtml", (object)model);

Моя цель - создать простую систему CMS, которая объединяет результаты нескольких действий / представлений контроллера и выводит их в макет.

У меня есть основное действие контроллера, которое получает описание страницы из базы данных.Код перебирает список других контроллеров и вызывает их действия, что приводит к динамической объектной модели и списку частичных фрагментов HTML, которые передаются в пользовательский WebViewPage.

1 Ответ

0 голосов
/ 20 марта 2012

Я немного не уверен в том, чего вы пытаетесь достичь.Однако, кроме RenderPartialViewToString, это метод расширения.Для использования в действии контроллера вы можете сделать что-то простое:

var result = this.RenderPartialViewToString("Index", model)

Где модель - это строго типизированная модель, используемая в представлении «Индекс».Например, если вы хотите отобразить представление в строку для использования в действии JSON, вы можете вернуть JSONResult с помощью:

return new JsonResult
           {
               JsonRequestBehavior = JsonRequestBehavior.AllowGet,
               Data = new {html = this.RenderPartialViewToString("Index", model)}
           };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...