Многоразовое место для размещения Email View Rendering Logic? - PullRequest
0 голосов
/ 10 августа 2011

У меня есть контроллер с именем EmailController , который (как вы уже догадались) отвечает за отправку электронных писем.

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

Проблема в том, что я не уверен, как вызвать метод действия моего EmailController из другого метода действия (который является HTTP POST, когда пользователь что-то делает).

Обычно я бы помещал этот вид операции (отправка по электронной почте) в службу, а фактическая логика отправки по электронной почте (SMTP) равна в службе, но EmailController отвечает за настройкусодержимое электронного письма (например, HTML), для которого необходимо отобразить представление в строку (следовательно, ему необходим контекст контроллера и он не может перейти в службу).

Как мне этого добиться?

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

Пример потока:

  1. Пользователь A переходит на страницу и отправляет форму.
  2. HTTPВызван POST ControllerAActionMethodA, данные отправлены в БД.
  3. Застрял.

Итак, на шаге 3 мне нужно:

  1. Извлечь некоторую информацию изданные просто POST'ed
  2. Создание модели представления
  3. Визуализация строго типизированного представления в строку
  4. Вызов метода обслуживания, который я создал, для отправки электронной почты SMTP

В настоящее время у меня есть 2/3/4 выше в EmailController, так что я надеялся использовать это.

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

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

Возможно, HTML-помощник или прМетод, выбранный в базовом контроллере, является лучшим вариантом, чем контроллер?

К вашему сведению, вот мой метод "Просмотр в строку" (я взял другой вопрос стека и отлично работает):

protected string RenderViewToString(string viewName, object model)
{
    if (string.IsNullOrEmpty(viewName))
        viewName = ControllerContext.RouteData.GetRequiredString("action");

    ViewData.Model = model;

    using (var sw = new StringWriter())
    {
        var viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, null);
        var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);

        return sw.GetStringBuilder().ToString();
    }
}

1 Ответ

0 голосов
/ 10 августа 2011

Вы можете взглянуть на пакет ActionMailer от nuGet. Тогда вам не нужен отдельный контроллер.

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