Asp.net mvc 3 试图调用控制器中的代码,但出现空引用错误

Asp.net mvc 3 试图调用控制器中的代码,但出现空引用错误,asp.net-mvc-3,orchardcms,mvcmailer,Asp.net Mvc 3,Orchardcms,Mvcmailer,我不想使问题过于复杂,但我认为我需要发布所有与此错误相关的代码 使用并引入了单独的发送机制(用于Orchard CMS自己的电子邮件) MVC编译器代码: 1) AskUsMailer.cs: public class AskUsMailer : MailerBase, IAskUsMailer { public AskUsMailer() : base() { //MasterName = "_Layout"; } public

我不想使问题过于复杂,但我认为我需要发布所有与此错误相关的代码

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

MVC编译器代码:

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;
    }
}
public interface IAskUsMailer : IDependency
{
    MvcMailMessage EMailAskUs(AskUsViewModel model);
}
2) IAskUsMailer.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;
    }
}
public interface IAskUsMailer : IDependency
{
    MvcMailMessage EMailAskUs(AskUsViewModel model);
}
3) AskUsController.cs:(下面是获取空引用错误)

注: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还包含发送方法:

    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);
            }
        }
    }
MvcMailer在没有添加的情况下工作得很好(在Orchard之外),但我正在尝试让Orchard内的一切都正常工作

我就是不知道我做错了什么。有什么想法吗


抱歉,代码太多。

IEmailMessaginService未实现独立性,因此Orchard无法将其作为依赖项找到。这就是为什么它是空的。

哪里有空的ref?您是否附加了调试器来查找?我在错误以粗体显示的地方添加了注释。我对出现错误的代码进行了注释。我想我将废弃多余的代码,并将其合并到
AskUsMailer.cs
中,看看这是否有效。啊,我只在IAskUsMailer上实现了。谢谢你的帮助。
public interface IEMailMessagingService
{
    MailMessage SendAskUs(AskUsViewModel model);
}