Проблема с MVCMailer

Не уверен, что кто-то еще сталкивался с этой проблемой, но я пытаюсь отправлять электронные письма, используя MVCMailer. Я смог установить и обновить пакет T4Scaffolding без каких-либо проблем.

У меня есть страница aspx, которая создает отчет, и я хочу, чтобы этот отчет был прикреплен к электронному письму. Однако, когда я оборачиваюсь и вызываю свой метод SendReport в классе UserMailers, он вызывает ошибку при вызове PopulateBody, говоря, что routeData имеет значение null

Вот мой код

public class UserMailer : MailerBase, IUserMailer
{
    /// <summary>
    /// Email Reports using this method
    /// </summary>
    /// <param name="toAddress">The address to send to.</param>
    /// <param name="viewName">The name of the view.</param>
    /// <returns>The mail message</returns>
    public MailMessage SendReport(string toAddress, string viewName)
    {
        var message = new MailMessage { Subject = "Report Mail" };
        message.To.Add(toAddress);

        ViewBag.Name = "Testing-123";

        this.PopulateBody(mailMessage: message, viewName: "SendReport");

        return message;
    }
}

Я получаю сообщение об ошибке: "Значение не может быть пустым. Имя параметра: routeData"

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

2 ответа

Это называется Mvc Mailer по причине. Вы не можете использовать его в обычном проекте asp.net (.aspx), только в проекте MVC.

Как сказал Филип, его нельзя использовать внутри codebehind на странице ASPX ASP.NET, потому что нет ControllerContext / RequestContext,

Самым простым способом для меня было просто создать действие контроллера, а затем использовать WebClient сделать HTTP-запрос со страницы ASPX.

    protected void Button1_Click(object sender, EventArgs e)
    {
        WebClient wc = new WebClient();

        var sendEmailUrl = "https://" + Request.Url.Host + 
                           Page.ResolveUrl("~/email/SendGenericEmail") + 
                           "?emailAddress=email@example.com" + "&template=Template1";

        wc.DownloadData(sendEmailUrl);
    }

Тогда у меня есть простой контроллер

public class EmailController : Controller
{
    public ActionResult SendGenericEmail(string emailAddress, string template)
    {
        // send email
        GenericMailer mailer = new GenericMailer();

        switch (template)
        {
            case "Template1":

                var email = mailer.GenericEmail(emailAddress, "Email Subject");
                email.Send(mailer.SmtpClient);
                break;

            default:
                throw new ApplicationException("Template " + template + " not handled");
        }

        return new ContentResult()
        {
            Content = DateTime.Now.ToString()
        };
    }
}

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

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