2012-05-08 58 views
2

不知道是否有人遇到了这个问题,但我想用发送电子邮件MVCMailer。我能够安装并更新T4Scaffolding软件包,没有任何问题。问题与MVCMailer

我有一个创建报表的aspx页面,我想附加到电子邮件,该报告。然而,当我转身叫我SendReport方法在UserMailers类,它抛出一个错误的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”

我看了网上,并没有发现任何与此有关的问题或任何人谁​​遇到了这个问题。

+0

我也越来越这个问题,但奇怪的是只有一两个我们发送电子邮件的,你有没有得到它的底部? – Tim

回答

2

它被称为的mvc梅勒是有原因的。 您不能在正常的asp.net(.aspx)项目中使用它,只能在MVC项目中使用它。

+0

菲利普 - 请指出我的帖子在哪里说,该项目不是一个MVC项目?有很多人在MVC项目中使用Web表单的例子。 – George

+0

我的不好,我认为错了:)仍然,问题仍然存在,如果您调用.aspx网络表单,路由不会加载。 –

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") + 
          "[email protected]" + "&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() 
     }; 
    } 
} 

当然也有许多问题,如安全性,协议(控制器将无法访问原来的页面),错误处理 - 但如果你发现自己卡住了,这可以工作。