ASP.NET MVC Render Просмотр строки для отправки по электронной почте

Я хочу использовать представления MVC для создания тела для электронного письма, и я сталкивался с этим ( http://www.brightmix.com/blog/renderpartial-to-string-in-asp-net-mvc/), но это не похоже, не работает со строго типизированными представлениями (ViewContext имеет значение null). Но я хотел чего-то такого, что предоставило бы полный вид, включая мастер-страницу.

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

Любые предложения будут великолепны!

Заранее спасибо.

Gifster

2 ответа

Решение

Вопрос уже задан (и получен ответ):

Визуализация представления в виде строки

Это бит, который я использую:

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 не будут работать согласованно на всех устройствах!

Вы можете использовать пакет MvcView NuGet, чтобы сделать это! Это просто, просто установите с помощью установочного пакета MvcMailer, и все готово! Используйте всю мощь механизма просмотра для создания шаблонов, главной страницы, просмотра моделей и аккуратной отправки html-писем!

Другие вопросы по тегам