2013-03-12 3 views
12

Я хотел бы использовать свой вид Razor как своего рода шаблон для отправки электронных писем, , поэтому я хотел бы «сохранить» мой шаблон в представлении, прочитать его в контроллере как строку, выполнить некоторые необходимые замены, а затем отправить Это.Как преобразовать вид Razor в строку?

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

ответ

17

Я использую следующее. Поместите его на свой базовый контроллер, если он у вас есть, и вы сможете получить доступ к нему во всех контроллерах.

public static string RenderPartialToString(Controller controller, string viewName, object model) 
{ 
    controller.ViewData.Model = model; 

    using (StringWriter sw = new StringWriter()) 
    { 
     ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); 
     ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
     viewResult.View.Render(viewContext, sw); 

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

написал что-то очень похожее недавно. боль в $$ –

+0

@DaveA Хе-хе, это боль действительно, должно быть проще. – mattytommo

+0

Как я могу сделать то же самое с .NET CORE? –

6

Посмотрите на RazorEngine библиотеку, которая делает именно то, что вы хотите. Я использовал его раньше для шаблонов электронной почты, и он отлично работает.

Вы можете просто сделать что-то вроде этого:

// Read in your template from anywhere (database, file system, etc.) 
var bodyTemplate = GetEmailBodyTemplate(); 

// Substitute variables using Razor 
var model = new { Name = "John Doe", OtherVar = "Hello!" }; 
var emailBody = Razor.Parse(bodytemplate, model); 

// Send email 
SendEmail(address, emailBody); 
+0

Это полезно, но у меня есть уже написанный код, который я не хочу менять. Я хотел бы только сохранить мой шаблон (html) в представлении и буквально прочитать html из представления в виде строки и выполнить замены в контроллере. –

+0

Понял. Я сделал то, что вы делаете в прошлом. Однако, как только я обнаружил библиотеку RazorEngine, я нашел, что это не только упрощает разработку синтаксического анализа шаблонов, но и упрощает работу с вашими шаблонами. Вы можете хранить шаблоны в базе данных или где-нибудь, что вы можете редактировать без редактирования кода. –