2015-01-02 4 views
2

Можно ли вызвать действие другого контроллера и получить его результирующий вид в виде строки?Вызов действия другого контроллера и получение вида в виде строки

Я хотел бы использовать стандартное поведение .net mvc, которое позволяет мне создавать сообщения электронной почты на основе правильной модели и представления. Я знаю, что я могу использовать RazorEngine, но в этом случае мне нужно передать полный путь для просмотра, и я должен перезаписать базовый класс, если я хочу использовать, например. @Html или @Url.

+0

Вы хотите назвать это из класса «Контроллер» или бизнес-уровня? Вы можете довольно легко получить полный путь к представлению, используя ['VirtualPathUtility'] (http://msdn.microsoft.com/en-us/library/system.web.virtualpathutility (v = vs.110) .aspx) – Rhumborl

+0

В каком контексте? Прямым способом было бы вызвать @ Html.Action, если у вас есть HtmlHelper. http://msdn.microsoft.com/en-us/library/system.web.mvc.html.childactionextensions.action.aspx – driis

+4

Вы видели [эту статью] (http://www.codemag.com/Article/ 1312081)? –

ответ

0

Я сделал это в нескольких случаях, добавив следующее в класс базового контроллера.

protected string RenderViewToString(string viewName, object model = null) 
{ 
    ViewData.Model = model; 
    using(StringWriter sw = new StringWriter()) 
    { 
    ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, null); 
    ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
    viewResult.View.Render(viewContext, sw); 

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

protected string RenderPartialViewToString(string viewName, object model = null) 
{ 
    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(); 
    } 
} 
Смежные вопросы