Электронная почта как вид - PullRequest
0 голосов
/ 27 мая 2010

Недавно я обсуждал, где электронная почта (уведомления и т. Д.) Должна отправляться в приложении ASP.NET MVC. Мой заклятый враг ухмылка утверждает, что имеет смысл только отправлять электронную почту с контроллера.

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

Я разработал метод расширения, который позволяет мне делать следующее:

<% Html.RenderEmail(model.FromAddress, model.ToAddress, model.Subject); %>

, который я на самом деле включаю в свой вид, отображаемый на экране. Прелесть в том, что, основываясь на соглашении, если я вызываю RenderEmail из родительского представления с именем MyView.ascx, я пытаюсь отобразить содержимое представления с именем MyViewEmail.ascx, если оно не найдено, и в этом случае я просто отправляю копию по электронной почте родительского представления.

Это, безусловно, делает его тестируемым (у меня все еще есть ISMTPService, внедренный для тестирования), я подумал, есть ли у кого-нибудь мысли о том, нарушает ли это хорошую практику. В использовании это было чрезвычайно удобно, когда нам нужно было легко отправить электронное письмо или изменить содержимое результатов, отправленных по электронной почте, в сравнении с отображаемыми в браузере результатами.

Спасибо

Hal

Ответы [ 3 ]

3 голосов
/ 27 мая 2010

Ваш "Немезида" верна.

Задача представления - отправлять HTML клиенту и ничего больше. Он не имеет права отправлять электронную почту.

Вы должны отправить электронное письмо внутри контроллера.

Если вы хотите отобразить представление по электронной почте, вы можете сделать это следующим образом:

var viewData = new ViewDataDictionary<T>(data);
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, "ViewName");

using (var writer = new StringWriter(CultureInfo.InvariantCulture)) {
    ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, viewData, new TempDataDictionary(), writer);
    viewResult.View.Render(viewContext, writer);

    viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);

    return writer.ToString();
}
0 голосов
/ 23 октября 2018

Разговорный ответ

Я полностью понимаю вашу идею. Может быть, необходимо сделать шаг назад от Microsoft-MV-фреймворка и взглянуть на более нетронутую установку MVC.

Если состояние представления может быть чем угодно, то в веб-приложении View не просто должен отправлять HTML . Фактически, если бы кто-то обрабатывал входящий заголовок HTTP Accept:, он содержал бы типы мультимедиа, которые могли бы помочь вам определить, с каким состоянием представления отвечать.

В случае XMLHttpRequest через JavaScript заголовок Accept: может содержать application/json или application/xml. Клиент будет ожидать JSON или XML. Отправка HTML была бы неправильной.

Теперь, поскольку электронная почта не отправляется непосредственно клиентскому пользовательскому агенту (после отправки формы), это скорее побочный эффект обработки формы , чем состояние представления, которое вы должны соответствовать и ответить с. В более "чистой" среде MVC электронная почта будет отправляться моделью как услуга. Контроллер не будет вовлечен в отправку электронной почты, поскольку это не то место, где должна находиться бизнес-логика для приложения.

Тем не менее, ваша точка зрения, что электронная почта (SMTP вместо HTTP) может быть как минимум вторичным представлением , имеет определенный резонанс. Однако для этого может потребоваться (в зависимости от приложения) передача значительного объема данных из модели в гипотетический «EmailView». Если это не является препятствием, то проблема заключается в необходимости обновления основного представления (веб-страницы) и отправки электронной почты с дополнительным представлением , пока модель находится в простаивает .

Таким образом, очень практично , чтобы позволить Модели отправлять электронную почту как часть бизнес-логики. Затем разрешите представлению обновить пользовательский агент. Вот почему я говорю, что отправка электронной почты - это скорее побочный эффект , чем истинное представление.

Тем не менее, точка зрения о SMTP. Просто заголовок Accept: для базового веб-приложения практически никогда не скажет application/batch-SMTP.

Что если вы пишете почтовые приложения на стороне сервера? Да, тогда вы, вероятно, будете видеть входящее application/batch-SMTP все время. : -)

IANA: Типы носителей

0 голосов
/ 09 марта 2011

Вы смотрели на MvcMailer? См. Пакет NuGet здесь и проектную документацию

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...