RazorGenerator, шаблоны и @Html


Я пытаюсь использовать RazorGenerator в качестве движка шаблонов электронной почты. Я хочу взять модель с данными, собрать правильный набор частичных представлений и вернуть HTML, который я могу отправить по электронной почте.
Edit: в дополнение к этому рабочему процессу любое решение должно быть редактируемым как a .файл cshtml и могут быть скомпилированы в dll . По разным причинам нецелесообразно развертывать сами файлы cshtml - если мы не можем встроить все наши представления razor в один файл, тогда мы не можем использовать это предложение. Следовательно, RazorGenerator.

До сих пор я проработал каждую его часть, за исключением партиалов. Когда я пытаюсь использовать @Html.Partial () в файле шаблона я получаю: The name 'Html' does not exist in the current context.

Основываясь на этом ответе, я знаю, что @Html не является частью Razor по умолчанию, и есть много ответов о том, как создать HtmlHelper в контроллере. Тем не менее, мне нужно создать его в шаблоне, который не имеет ControllerContext, что мне нужно было бы следовать этим образцы.

Я также пытался использовать @Include, но шаблон RazorGenerator, похоже, не поддерживает это. Edit: я также попытался создать новый класс, который унаследовал от TemplateBase<> и скопировал всю функциональность RazorTemplateBase, но я получаю NullReferenceException s в строке @Include.

Итак, мой основной вопрос: есть ли лучший способ включить другой файл Razor (с моделью) в мой файл?

Во-вторых, если нет лучшего способа, как я могу получить HtmlHelper создал?


Edit for bounty: просто чтобы повторить, четыре вещи, которые мне нужны в приемлемом ответе:

  1. возможность редактирования .cshtml файлов с помощью стандартного редактора (нет "хранить его в виде строки" или такого)
  2. возможность скомпилировать все в единую dll, которую можно развернуть с помощью нашей текущей системы сборки (мы не можем развернуть много отдельных .cshtml'S)
  3. возможность ссылаться на один .cshtml файл из другого, и передать модель - эквивалентно @Includes или @Html.Partial (любой из которых вполне приемлем, если они работают)
  4. возможность отправить результат по электронной почте с вложениями. (У меня уже есть код для этого, если результат является строкой или преобразуется в единицу.)
В настоящее время я могу получить большинство комбинаций из трех из них, но я не могу получить все четыре сразу. Я открыт для новых библиотек, заменяющих RazorGenerator, или выбрасываю любую часть того, что у меня уже есть, пока результат работает как необходимый.
2 6

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;
}