ASP.NET MVC Render Просмотр строки для отправки по электронной почте - PullRequest
7 голосов
/ 12 ноября 2010

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

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

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

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

Gifster

Ответы [ 2 ]

15 голосов
/ 12 ноября 2010

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

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

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

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

4 голосов
/ 13 января 2011

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

...