试图在我的控制器中调用代码,但得到Null Reference错误

时间:2012-11-25 18:19:55

标签: asp.net-mvc-3 orchardcms mvcmailer

不要让问题过于复杂,但我想我需要发布所有挂在此错误中的代码。

使用MvcMailer并引入了单独的Send机制(用于Orchard CMS自己的电子邮件)。

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:(以下为空参考错误)

[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;
    }

我认为这是我问题的一部分。

现在,新代码尝试挂钩Orchard的电子邮件:

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@email.com");
        //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还包含Send方法:

    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中,我收到的错误是没有实现,所以我自动生成了以下内容(不知道这是否是我的错误的一部分):

    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在没有这个添加的情况下工作正常(在Orchard之外),但我试图让所有东西都在Orchard中工作。

我无法弄清楚我做错了什么。有什么想法吗?

抱歉代码过多。

1 个答案:

答案 0 :(得分:2)

IEmailMessaginService没有实现IDependency,因此Orchard无法将其视为依赖项。这就是为什么它是空的。