Вопрос уже задан (и получен ответ):
Визуализация представления в виде строки
Это бит, который я использую:
protected string RenderViewToString<T>(string viewPath, T model, System.Web.Mvc.ControllerContext controllerContext) {
using (var writer = new StringWriter()) {
var view = new WebFormView(viewPath);
var vdd = new ViewDataDictionary<T>(model);
var viewCxt = new ViewContext(controllerContext, view, vdd, new TempDataDictionary(), writer);
viewCxt.View.Render(viewCxt, writer);
return writer.ToString();
}
}
Лучшее место для этого метода - проект библиотеки классов, на который ссылается ваш проект mvc. Главным образом потому, что таким образом вы можете легко использовать его во всех своих приложениях. Но также потому, что это не логика приложения (поэтому она не принадлежит контроллеру) и не относится к модели. Некоторые вещи просто утилиты.
Обратите внимание, что для того, чтобы это работало, параметр viewPath ДОЛЖЕН быть ФИЗИЧЕСКИМ ПУТОМ к файлу, дополненным расширением .aspx. Вы не можете использовать маршрут, так как класс WebFormView требует физического пути в своем конструкторе.
Это сделает полный просмотр и учтет главную страницу.
ПРЕДУПРЕЖДЕНИЕ ЗДОРОВЬЯ ДЛЯ HTML ЭЛЕКТРОННЫХ ПОЧТ:
Письма в формате HTML и устройства, на которых вы их читаете, спроектированы еще сложнее и ограниченнее, чем веб-сайты и браузеры. То, что работает в одном, не будет работать в другом. Таким образом, с помощью электронных писем в формате html, вы действительно должны сохранять простоту! Ваша прекрасная страница с меню и относительными изображениями и прочим, просто не будет работать на всех устройствах электронной почты. Как пример, атрибут src images должен быть абсолютным и включать домен:
Это не сработает:
<img src="/Images/MyImage.gif" ... />
Бит это будет:
<img src="http://www.mywebsite.com/Images/MyImage.gif" ... />
С этими предостережениями все работает нормально, и я им пользуюсь. Только не пытайтесь отправить им полный трюк с вашего сайта, потому что это не сработает!
Еще важнее:
Все CSS должны быть INLINE и только для базовых стилей: цвета, границы, отступы. Но не плавающие и позиционирующие. Макеты CSS не будут работать согласованно на всех устройствах!