RazorGenerator, шаблоны и @Html
Я пытаюсь использовать RazorGenerator в качестве движка шаблонов электронной почты. Я хочу взять модель с данными, собрать правильный набор частичных представлений и вернуть HTML, который я могу отправить по электронной почте.
Edit: в дополнение к этому рабочему процессу любое решение должно быть редактируемым как a .файл cshtml и могут быть скомпилированы в dll . По разным причинам нецелесообразно развертывать сами файлы cshtml - если мы не можем встроить все наши представления razor в один файл, тогда мы не можем использовать это предложение. Следовательно, RazorGenerator.
The name 'Html' does not exist in the current context
.
Основываясь на этом ответе, я знаю, что @Html
не является частью Razor по умолчанию, и есть много ответов о том, как создать HtmlHelper
в контроллере. Тем не менее, мне нужно создать его в шаблоне, который не имеет ControllerContext
, что мне нужно было бы следовать этим образцы.
Я также пытался использовать @Include, но шаблон RazorGenerator, похоже, не поддерживает это. Edit: я также попытался создать новый класс, который унаследовал от TemplateBase<>
и скопировал всю функциональность RazorTemplateBase
, но я получаю NullReferenceException
s в строке @Include
.
Во-вторых, если нет лучшего способа, как я могу получить HtmlHelper создал?
Edit for bounty: просто чтобы повторить, четыре вещи, которые мне нужны в приемлемом ответе:
- возможность редактирования
.cshtml
файлов с помощью стандартного редактора (нет "хранить его в виде строки" или такого) - возможность скомпилировать все в единую dll, которую можно развернуть с помощью нашей текущей системы сборки (мы не можем развернуть много отдельных .cshtml'S)
- возможность ссылаться на один .cshtml файл из другого, и передать модель - эквивалентно
@Includes
или@Html.Partial
(любой из которых вполне приемлем, если они работают) - возможность отправить результат по электронной почте с вложениями. (У меня уже есть код для этого, если результат является строкой или преобразуется в единицу.)
2 ответа:
Просто мысль, но почему бы вам не настроить другие страницы и в своем коде контроллера не открыть HTTPWebRequest / WebClient, отправить туда необходимые данные, получить весь html / текст из этого представления, объединить несколько вызовов вместе и затем отправить всю эту строку по электронной почте.
public ActionResult SomeAction() { // call other section logic using HttpWebRequest or WebClient // /controller/emailsection/{vars}/...... // Get the string out of the request add it to ViewData["xxx"] // rinse and repeat for other sections } public ActionResult EmailSection() { //put section logic here Response.ContentType = "text/html"; // "text/plain" Response.Write("Some HttpWebResponse"); return null; }