Есть ли способ получить содержимое PartialView HTML в контроллере? - PullRequest
3 голосов
/ 08 марта 2012

У меня есть частичное представление с контроллером с выходной кэш-памятью, поскольку мне нужно кэшировать этот элемент.

Затем мне нужно визуализировать этот PartialView на каждой странице, но сначала мне нужно выполнить некоторую замену строки.

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

Спасибо

Ответы [ 3 ]

8 голосов
/ 08 марта 2012

Я использую эти методы в своей пользовательской базе Controller.

    public string RenderPartialToString(string partialViewName, object model)
    {
        InvalidateControllerContext();
        IView view = ViewEngines.Engines.FindPartialView(ControllerContext, partialViewName).View;
        string result = RenderViewToString(view, model);
        return result;
    }

    public string RenderViewToString(string viewName, object model)
    {
        InvalidateControllerContext();
        IView view = ViewEngines.Engines.FindView(ControllerContext, viewName, null).View;
        string result = RenderViewToString(view, model);
        return result;
    }

    public string RenderViewToString(IView view, object model)
    {
        InvalidateControllerContext();
        string result = null;
        if (view != null)
        {
            StringBuilder sb = new StringBuilder();
            using (StringWriter writer = new StringWriter(sb))
            {
                ViewContext viewContext = new ViewContext(ControllerContext, view, new ViewDataDictionary(model), new TempDataDictionary(), writer);
                view.Render(viewContext, writer);
                writer.Flush();
            }
            result = sb.ToString();
        }
        return result;
    }

    private void InvalidateControllerContext()
    {
        if (ControllerContext == null)
        {
            ControllerContext context = new ControllerContext(System.Web.HttpContext.Current.Request.RequestContext, this);
            ControllerContext = context;
        }
    }

Метод InvalidateControllerContext предназначен для сценария, в котором вам нужно вручную создавать Controller s для визуализации партиалов илипредставления вне контекста контроллера.

2 голосов
/ 08 марта 2012

Нет, не делай этого.Ваш контроллер не должен отображать ваш View, это работа механизма шаблонов.

Передайте значения «замены» в качестве модели вашему PartialView.

public ActionResult SomeAction()
{
  SomeModelmodel = new SomeModel(); // your model
  return PartialView(model); // partial view with your model
}

И Partial View:

@model SomeModel

<div>Replace your values with @Model.Value instead of String.Replace().</div>
0 голосов
/ 13 июня 2014

Просто хотел поделиться модификацией решения @ Nico, если вы хотите использовать данные ViewBag из действия вашего контроллера, то измените RenderViewToString следующим образом, я использую controller.TempData вместо new TempDataDictionary().

public string RenderViewToString( IView view, object model)
{
    InvalidateControllerContext();
    string result = null;
    if (view != null)
    {
        StringBuilder sb = new StringBuilder();
        using (StringWriter writer = new StringWriter(sb))
        {
            // use TempData from controller
            ViewContext viewContext = new ViewContext(ControllerContext, view, 
                new ViewDataDictionary(model), this.TempData, writer);
            view.Render(viewContext, writer);
            writer.Flush();
        }
        result = sb.ToString();
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...