Я увидел, что кому-то интересно, как это сделать для другого контроллера.
В моем случае все мои шаблоны электронной почты были в папке Views / Email, но вы могли изменить это, чтобы передать в контроллерв котором у вас есть связанные представления для.
public static string RenderViewToString(Controller controller, string viewName, object model)
{
var oldController = controller.RouteData.Values["controller"].ToString();
if (controller.GetType() != typeof(EmailController))
controller.RouteData.Values["controller"] = "Email";
var oldModel = controller.ViewData.Model;
controller.ViewData.Model = model;
try
{
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName,
null);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
//Cleanup
controller.ViewData.Model = oldModel;
controller.RouteData.Values["controller"] = oldController;
return sw.GetStringBuilder().ToString();
}
}
catch (Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
throw ex;
}
}
По сути, это то, что вы берете контроллер, такой как AccountController, и модифицируете его так, чтобы он считал EmailController так, чтобы код смотрел в папке Views/Email
.Это необходимо сделать, потому что метод FindView
не принимает прямой путь в качестве параметра, ему нужен ControllerContext
.
После завершения рендеринга строки он возвращает AccountController обратно в исходное состояние, которое будет использоваться объектом Response.