Известно, как сгенерировать HTML-код данного частичного представления на движке представления ASP.NET .
Но если эта функция используется в частичном представлении бритвы, она не работает, поскольку в исключении указано, что частичное представление не является производным от «UserControl».
Как исправить рендеринг для поддержки частичного просмотра бритвы?
Мне это нужно, потому что я генерирую электронные письма из этих частичных представлений ...
ОБНОВИТЬ:
Код, который не работает (@mcl):
public string RenderPartialToString(string controlName, object viewData)
{
ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
viewPage.Url = this.GetUrlHelper();
string fullControlName = "~/Views/Email/" + controlName + ".ascx";
viewPage.ViewData = new ViewDataDictionary(viewData);
viewPage.Controls.Add(viewPage.LoadControl(fullControlName));
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter tw = new HtmlTextWriter(sw))
{
viewPage.RenderControl(tw);
}
}
return sb.ToString();
}
c#
asp.net-mvc
razor
Питер Стегнар
источник
источник
Ответы:
Обновить
источник
Хотя адекватные ответы уже были даны, я хотел бы предложить менее подробное решение, которое можно использовать без вспомогательных методов, доступных в классе контроллера MVC. Используя стороннюю библиотеку под названием "RazorEngine", вы можете использовать ввод-вывод файла .Net для получения содержимого файла razor и вызова
Загрузите стороннюю библиотеку здесь .
источник
Кроме того, можно использовать
RenderView Controller extension
из здесь ( источник )и используйте это так:
он работает для движков просмотра бритв и веб-форм
источник
Я видел, что кому-то было интересно, как это сделать для другого контроллера.
В моем случае у меня были все мои шаблоны электронной почты в папке Views / Email, но вы могли изменить это, чтобы передать контроллер, с которым у вас связаны представления.
По сути, при этом нужно взять контроллер, например AccountController, и изменить его так, чтобы он воспринимался как EmailController, чтобы код смотрел в
Views/Email
папку. Это необходимо сделать, потому чтоFindView
метод не принимает в качестве параметра прямой путь, ему нужен файлControllerContext
.После завершения рендеринга строки он возвращает AccountController в исходное состояние, которое будет использоваться объектом Response.
источник
отличный код; Небольшая подсказка: если иногда приходится пропускать больше данных, а не только модель просмотра ..
источник
Заимствование ответа @jgauffin как расширения HtmlHelper:
Использование в режиме бритвы:
источник