Получение копии визуализированного вида - PullRequest
0 голосов
/ 20 декабря 2011

Так что это может звучать немного странно, но, по сути, я пытаюсь сделать представление заранее в контроллере, чтобы передать его свойству в модели. (Это так, чтобы позже я мог передать представленный HTML-код представлению вызову службы, поэтому у меня есть причина.) У меня есть код, который почти выполняет это (адаптировано из этого ответа ), с плохим побочным эффектом возврата вида, который был визуализирован дважды:

public ActionResult Action(object paramater)
{
   var model = new MyModel(parameter);
   ViewResult view = View("~/... path to view .../View.cshtml", model);

   string data;

   using (var sw = new StringWriter())
   {
      view.ExecuteResult(ControllerContext);
      var viewContext = new ViewContext(ControllerContext, view.View, ViewData, TempData, sw);
      view.View.Render(viewContext, sw);
      data = sw.ToString();
   }

   model.ViewRender = data;

   return view;
}

Это успешно помещает копию HTML представления в модель, но само представление отображается дважды (так кажется), поэтому я получаю веб-страницу, которая представляет собой две копии одной и той же вещи, одна поверх другой .

Я пробовал пару разных способов вернуть вид без этого побочного эффекта - сделать новый полностью с return View(model), перейдя в другой метод - пока ничего не получалось.

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Вместо того, чтобы возвращать представление, вы должны вернуть необработанный контент:

return Content(data, "text/html");
0 голосов
/ 20 декабря 2011

Я понял это. view.ExecuteResult() пишет напрямую в HttpContext.Response, поэтому вызов HttpResponse.Clear() перед возвратом нового представления работал отлично:

public ActionResult Action(object paramater)
{
   var model = new MyModel(parameter);
   ViewResult view = View("~/... path to view .../View.cshtml", model);

   string data;

   using (var sw = new StringWriter())
   {
      view.ExecuteResult(ControllerContext);
      var viewContext = new ViewContext(ControllerContext, view.View, ViewData, TempData, sw);
      view.View.Render(viewContext, sw);
      data = sw.ToString();
   }

   model.ViewRender = data;
   HttpContext.Response.Clear();

   return View("~/... path to view .../View.cshtml", model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...