2

不确定其他人是否遇到过这个问题,但我正在尝试使用 MVCMailer 发送电子邮件。我能够安装它并更新 T4Scaffolding 包,没有任何问题。

我有一个正在创建报告的 aspx 页面,我希望将该报告附加到电子邮件中。但是,当我转身并在 UserMailers 类中调用我的 SendReport 方法时,它会在 PopulateBody 调用中引发错误,指出 routeData 为空

这是我的代码

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”

我在网上查看过,没有发现与此问题相关的任何内容或遇到此问题的任何人。

4

2 回答 2

2

它被称为Mvc Mailer 是有原因的。您不能在普通的 asp.net (.aspx) 项目中使用它,只能在 MVC 项目中使用。

于 2012-05-10T09:19:16.997 回答
0

正如 Filip 所说,它不能在 ASP.NET ASPX 页面的代码隐藏中使用,因为没有ControllerContext/ RequestContext

对我来说最简单的方法是创建一个控制器操作,然后使用WebClient它从 ASPX 页面发出一个 http 请求。

    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()
        };
    }
}

当然还有很多问题,比如安全、协议(控制器无法访问原始页面)、错误处理——但如果你发现自己卡住了,这可以工作。

于 2015-03-13T01:50:00.560 回答