2012-11-25 21 views
0

不想過度複雜化的問題,但我認爲我需要發佈所有鉤入此錯誤的代碼。試圖在我的控制器調用代碼,但得到空參考錯誤

使用MvcMailer並引入了一個單獨的Send機制(與Orchard CMS自己的EMail一起使用)。

的MvcMailer代碼:

1)AskUsMailer.cs:

public class AskUsMailer : MailerBase, IAskUsMailer 
{ 
    public AskUsMailer() 
     : base() 
    { 
     //MasterName = "_Layout"; 
    } 

    public virtual MvcMailMessage EMailAskUs(AskUsViewModel model) 
    { 
     var mailMessage = new MvcMailMessage { Subject = "Ask Us" }; 
     ViewData.Model = model; 
     this.PopulateBody(mailMessage, viewName: "EMailAskUs"); 
     return mailMessage; 
    } 
} 

2)IAskUsMailer.cs:

public interface IAskUsMailer : IDependency 
{ 
    MvcMailMessage EMailAskUs(AskUsViewModel model); 
} 

3)AskUsController.cs:(抵達NULL參考誤差如下)

[Themed] 
    public ActionResult Submitted() 
    { 
     //This is the new call (see new code below): 
     //Note: Debugging steps through eMailMessagingService, 
     //then shows the null reference error when continuing to 
     //SendAskUs 
     eMailMessagingService.SendAskUs(askUsData); 
     //Below is normal MvcMailer call: 
     //AskUsMailer.EMailAskUs(askUsData).Send(); 
     return View(askUsData); 
    } 

注:askUsData是在控制器單獨的塊定義:

private AskUsViewModel askUsData; 
    protected override void OnActionExecuting(ActionExecutingContext 
     filterContext) 
    { 
     var serialized = Request.Form["askUsData"]; 
     if (serialized != null) //Form was posted containing serialized data 
     { 
      askUsData = (AskUsViewModel)new MvcSerializer(). 
       Deserialize(serialized, SerializationMode.Signed); 
      TryUpdateModel(askUsData); 
     } 
     else 
      askUsData = (AskUsViewModel)TempData["askUsData"] ?? 
       new AskUsViewModel(); 
     TempData.Keep(); 
    } 
    protected override void OnResultExecuted(ResultExecutedContext 
     filterContext) 
    { 
     if (filterContext.Result is RedirectToRouteResult) 
      TempData["askUsData"] = askUsData; 
    } 

我不知道如何讓我的EMailMessagingService.cs(見下文)打電話到控制器,所以在一個單獨的塊控制器我這樣做:

private IEMailMessagingService eMailMessagingService; 

    public AskUsController(IEMailMessagingService eMailMessagingService) 
    { 
     this.eMailMessagingService = eMailMessagingService; 
    } 

我認爲這是我的問題的一部分。

現在,新的代碼試圖掛接到果園的電子郵件:

1)EMailMessagingServices.cs:

public class EMailMessagingService : IMessageManager 
{ 
    private IAskUsMailer askUsMailer; 
    private IOrchardServices orchardServices; 
    public EMailMessagingService(IAskUsMailer askUsMailer, 
     IOrchardServices orchardServices) 
    { 
     this.orchardServices = orchardServices; 
     this.askUsMailer = askUsMailer; 
     this.Logger = NullLogger.Instance; 
    } 

    public ILogger Logger { get; set; } 

    public void SendAskUs(AskUsViewModel model) 
    { 
     var messageAskUs = this.askUsMailer.EMailAskUs(model); 
     messageAskUs.To.Add("[email protected]"); 
     //Don't need the following (setting up e-mails to send a copy anyway) 
     //messageAskUs.Bcc.Add(AdminEmail); 
     //messageAskUs.Subject = "blabla"; 

     Send(messageAskUs); 
    } 
    .... 
} 

的EMailMessagingService.cs還包含發送方法:

private void Send(MailMessage messageAskUs) 
    { 
     var smtpSettings = orchardServices.WorkContext. 
      CurrentSite.As<SmtpSettingsPart>(); 

     // can't process emails if the Smtp settings have not yet been set 
     if (smtpSettings == null || !smtpSettings.IsValid()) 
     { 
      Logger.Error("The SMTP Settings have not been set up."); 
      return; 
     } 

     using (var smtpClient = new SmtpClient(smtpSettings.Host, 
      smtpSettings.Port)) 
     { 
      smtpClient.UseDefaultCredentials = 
       !smtpSettings.RequireCredentials; 
      if (!smtpClient.UseDefaultCredentials && 
       !String.IsNullOrWhiteSpace(smtpSettings.UserName)) 
      { 
       smtpClient.Credentials = new NetworkCredential 
        (smtpSettings.UserName, smtpSettings.Password); 
      } 

      if (messageAskUs.To.Count == 0) 
      { 
       Logger.Error("Recipient is missing an email address"); 
       return; 
      } 

      smtpClient.EnableSsl = smtpSettings.EnableSsl; 
      smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; 

      messageAskUs.From = new MailAddress(smtpSettings.Address); 
      messageAskUs.IsBodyHtml = messageAskUs.Body != null && 
       messageAskUs.Body.Contains("<") && 
       messageAskUs.Body.Contains(">"); 

      try 
      { 
       smtpClient.Send(messageAskUs); 
       Logger.Debug("Message sent to {0} with subject: {1}", 
        messageAskUs.To[0].Address, messageAskUs.Subject); 
      } 
      catch (Exception e) 
      { 
       Logger.Error(e, "An unexpected error while sending 
        a message to {0} with subject: {1}", 
        messageAskUs.To[0].Address, messageAskUs.Subject); 
      } 
     } 
    } 

現在,在EMailMessagingService.cs中,我收到一個錯誤,說明事情沒有被執行,所以我自動生成了f ollowing(不知道這是我的錯誤的部分):

public void Send(Orchard.ContentManagement.Records.ContentItemRecord recipient, string type, string service, System.Collections.Generic.Dictionary<string, string> properties = null) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Send(System.Collections.Generic.IEnumerable<Orchard.ContentManagement.Records.ContentItemRecord> recipients, string type, string service, System.Collections.Generic.Dictionary<string, string> properties = null) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Send(System.Collections.Generic.IEnumerable<string> recipientAddresses, string type, string service, System.Collections.Generic.Dictionary<string, string> properties = null) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool HasChannels() 
    { 
     throw new NotImplementedException(); 
    } 

    public System.Collections.Generic.IEnumerable<string> GetAvailableChannelServices() 
    { 
     throw new NotImplementedException(); 
    } 

2)IEMailMessagingServices.cs

public interface IEMailMessagingService 
{ 
    MailMessage SendAskUs(AskUsViewModel model); 
} 

MvcMailer沒有這除了正常工作(園外),但我想讓所有的一切在烏節路上工作。

我只是無法弄清楚我做錯了什麼。有什麼想法嗎?

對不起,代碼過多。

+0

*您在哪裏*得到一個空引用?你是否附加了一個調試器來發現? –

+0

我在粗體錯誤處添加了一個註釋。我評論了出現錯誤的代碼。我想我將廢棄額外的代碼,並將其合併到'AskUsMailer.cs'中以查看是否有效。 – REMESQ

回答

2

IEmailMessaginService沒有實現IDependency,所以它不能被Orchard找到作爲依賴。這就是爲什麼它是空的。

+0

啊,我只在IAskUsMailer上實現。謝謝您的幫助。 – REMESQ

相關問題