Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在MVC中从服务层访问HttpContext_Asp.net Mvc_Asp.net Mvc 3_Asp.net Mvc 4_Razor_Mvcmailer - Fatal编程技术网

Asp.net mvc 如何在MVC中从服务层访问HttpContext

Asp.net mvc 如何在MVC中从服务层访问HttpContext,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,razor,mvcmailer,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Razor,Mvcmailer,我正在尝试在我的MVC项目中发送格式化的电子邮件。在我的BaseService类中,使用此方法可以完美地发送普通电子邮件,所有其他服务都继承自: public void SendAsyncEmail(MailMessage message) { var client = new SmtpClient("smtp.gmail.com", 587) { Credentials = new NetworkC

我正在尝试在我的MVC项目中发送格式化的电子邮件。在我的BaseService类中,使用此方法可以完美地发送普通电子邮件,所有其他服务都继承自:

public void SendAsyncEmail(MailMessage message)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("cred", "password"),
                EnableSsl = true
            };
            client.SendCompleted += (s, e) =>
            {
                client.Dispose();
                message.Dispose();
            };
            ThreadPool.QueueUserWorkItem(o => client.SendAsync(message, Tuple.Create(client, message)));
        }
现在,我需要将每个MailMessage.body转换为HTML页面,而不是一个纯文本的主体,理想的方法是使用Razor模板。我发现MVCMailer:

我安装了它,构建了一些模板,并在我的BaseService中添加了以下内容:

public virtual MvcMailMessage Welcome()
    {
        ViewBag.Name = "Test";
        return Populate(x =>
        {
            x.viewName = "Welcome";
            x.To.Add("sohan39@example.com");
        });
    }
但是我的服务没有HTTPContext,所以ViewBag没有解析(也没有填充)


最简单的方法是什么?你把Razor和MVC视图搞混了。Razor只是一种模板语言,它本身没有HttpContext的概念,也不应该有HttpContext。视图在一个请求周期中接收HttpContext,因为它是一个web请求,但是如果您在请求周期之外使用Razor,那么您就没有它。因此,最简单的解决方案就是不使用ViewBag。就个人而言,我想说的是,即使您拥有HttpContext供您使用,建议也应该适用,但这与问题无关


我对MvcMailer不太熟悉;我自己用邮递。但是,我相信校长基本上是一样的。将模型或对象传递到邮件渲染中,然后可以访问视图中的数据。因此,与其使用ViewBag,不如直接传递数据。如果MvcMailer无法将任意数据添加到其视图上下文中(我会感到惊讶),那么请尝试Postal。使用Postal,您可以创建一个子类
Postal.Email
,其中包含您喜欢的任何数据。它的功能类似于视图模型。然后,您可以在该模型上强烈地键入视图,并在视图中充分利用它,同时提供intellisense支持。如果您需要动作中的一些信息,只需将其传递到模型中即可查看:简单。

谢谢Chris。对于遇到此问题的任何其他人,scaffolding会为您生成一个Welcome()方法,作为一个单独的Mailers()文件夹,使所有这些工作都很顺利。再加上上面的解释,我又动了起来:)