Как представить частичное представление в строке

У меня есть следующий код:

public ActionResult SomeAction()
{
    return new JsonpResult
    {
        Data = new { Widget = "some partial html for the widget" }
    };
}

Я хотел бы изменить его так, чтобы я мог иметь

public ActionResult SomeAction()
{
    // will render HTML that I can pass to the JSONP result to return.
    var partial = RenderPartial(viewModel); 
    return new JsonpResult
    {
        Data = new { Widget = partial }
    };
}

действительно ли это возможно? Кто-то мог объяснить как?

отметьте, я отредактировал вопрос прежде, чем отправить решение.

47
задан DaveDev 29 March 2010 в 16:26
поделиться

2 ответа

Это немного измененная версия ответа, который работает:

public static string RenderPartialToString(string controlName, object viewData)
{
    ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };

    viewPage.ViewData = new ViewDataDictionary(viewData);
    viewPage.Controls.Add(viewPage.LoadControl(controlName));

    StringBuilder sb = new StringBuilder();
    using (StringWriter sw = new StringWriter(sb))
    {
        using (HtmlTextWriter tw = new HtmlTextWriter(sw))
        {
            viewPage.RenderControl(tw);
        }
    }

    return sb.ToString();
}

Использование:

string ret = RenderPartialToString("~/Views/MyController/MyPartial.ascx", model);
25
ответ дан 26 November 2019 в 19:37
поделиться

Дэйв,

вариант той же темы (mvc v1.0):

        protected static string RenderPartialToString(Controller controller, string partialName, object model)
    {
        var vd = new ViewDataDictionary(controller.ViewData);
        var vp = new ViewPage
        {
            ViewData = vd,
            ViewContext = new ViewContext(),
            Url = new UrlHelper(controller.ControllerContext.RequestContext)
        };

        ViewEngineResult result = ViewEngines
                                  .Engines
                                  .FindPartialView(controller.ControllerContext, partialName);

        if (result.View == null)
        {
            throw new InvalidOperationException(
            string.Format("The partial view '{0}' could not be found", partialName));
        }
        var partialPath = ((WebFormView)result.View).ViewPath;

        vp.ViewData.Model = model;

        Control control = vp.LoadControl(partialPath);
        vp.Controls.Add(control);

        var sb = new StringBuilder();

        using (var sw = new StringWriter(sb))
        {
            using (var tw = new HtmlTextWriter(sw))
            {
                vp.RenderControl(tw);
            }
        }
        return sb.ToString();
    }

использование в контроллере:

        public string GetLocationHighlites()
    {
        IBlockData model = WebPagesMapper.GetLocationHighlites();
        // **this** being the controoler instance
        // LocationPartial.ascx can be defined in shared or in view folder
        return RenderPartialToString(**this**,"LocationPartial", model);
    }
1
ответ дан 26 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: