我正在尝试使用最新版本的NuGet 让MvcMailer在一个新的MVC 4 Beta项目中工作(仅为尝试这个而创建).
我走到了台阶
PM> Scaffold Mailer UserMailer欢迎,密码重置
此时我看到错误消息:
无法解析别名'Scaffold',因为它指的是术语'Invoke-Scaffolder',它不被识别为cmdlet,函数,可操作程序或脚本文件.验证该术语,然后重试.在行:1 char:9 + Scaffold <<<< Mailer UserMailer Welcome,PasswordReset + CategoryInfo:ObjectNotFound:(Scaffold:String)[],CommandNotFoundException + FullyQualifiedErrorId:AliasNotResolvedException
更新:安装MvcScaffolding(不是NuGet先决条件...)后,同一命令的错误消息将更改为:
Invoke-Scaffolder:找不到接受参数'UserMailer'的位置参数.在行:1字符:9 +脚手架<<<< Mailer UserMailer欢迎,PasswordReset + CategoryInfo:InvalidArgument:(:) [Invoke-Scaffolder],ParameterBindingException + FullyQualifiedErrorId:PositionalParameterNotFound,T4Scaffolding.Cmdlets.InvokeScaffolderCmdlet
我该如何解决这个问题?
我们从ASP.NET MVC 3 Razor Web应用程序发送电子邮件.
目前我们正在使用ActionMailer.NET.
我看过MvcMailer.
两者的问题是他们需要一个Http Context来执行.
这个问题是我想要异步发送电子邮件.现在我知道您可以异步执行实际发送(例如SMTP调用),但我希望发送电子邮件的整个过程是异步的,例如:
public ActionResult DoSomething(Something something)
{
_db.Save(something);
Task.Factory.StartNew(() => {
new MailController().DoSomething().Send(something);
});
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
在"DoSomething"方法中,我再次查询数据库,执行其他操作等等....我希望所有这些都是异步的 - 因此整个调用都包含在一个任务中,而不是仅仅执行.SendAsync().希望有道理.
上面的示例是ActionMailer,它会中断 - 因为HTTP上下文在生成的线程中消失了.
有谁知道我怎么能让这个工作,或者另一个不依赖于HTTP上下文存在的包?
我不确定为什么需要HTTP上下文 - 这里没有请求路由,只需将文件系统上的视图解析为HTML.
我正在使用ASP.NET MVC 3和MVCMailer,我尝试使用SendAsync发送电子邮件,但实际上它还需要更长的时间.
所以我试图像下面的代码一样使用Task.Factory:
var task1 = Task.Factory.StartNew(
state =>
{
var mail = new UserMailer();
var msg = mail.Welcome("My Name", "myemail@gmail.com");
msg.SendAsync();
});
task1.Wait();
Run Code Online (Sandbox Code Playgroud)
问题是,MVCMailer需要HttpContext,但在这个任务中我得到了HttpContext Null.
如何发送Async电子邮件?
我正在研究使用MVcMailer制作更好的电子邮件.
但是我不确定的一件事是如何组织代码.我目前有2个项目.一个用于mvc,一个用于我的repos和服务层.
我的第二个项目不了解MVC,我想保持这种方式.
我在想,我的SMTP代码就会进入一个服务层或包装,然后我就从其他服务层,当我需要发送电子邮件进行调用它.
那么MVC邮件适合哪里?我是否在控制器中生成主体然后将其传递给将其传递给我的smtp类的服务层?
我无法使用visual studio测试套件和Moq成功运行MvcMailer的单元测试.我已经逐字逐句地复制了wiki中的示例,但每次都得到以下异常:
Test method MvcMailerTest.Tests.MailerTest.TestMethod1 threw exception:
System.ArgumentNullException: Value cannot be null.
Parameter name: httpContext
Run Code Online (Sandbox Code Playgroud)
代码如下:(使用VS单元测试框架 - 在使用nUnit时完全相同的错误,如示例中所示)
//Arrange: Moq out the PopulateBody method
var _userMailerMock = new Mock<UserMailer>();
_userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), "Welcome", null));
_userMailerMock.CallBase = true;
//Act
var mailMessage = _userMailerMock.Object.Welcome();
Run Code Online (Sandbox Code Playgroud)
在Welcome()方法中的以下行失败(直接从wiki复制):
PopulateBody(mailMessage, viewName: "Welcome");
Run Code Online (Sandbox Code Playgroud)
维基在这里:https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide
类似(几乎完全相同)问题:MvcMailer:无法在使用Url.Action的Razor Views上完成NUnit测试
任何人都知道如何解决/解决这个问题?链接的问题说我需要模拟我已经完成的PopulateBody方法(根据维基).
我不知道我是否正确地解释了这一点,或者解决方案是否相当简单,所以这里是:
我正在使用MvcMailer,但在此之前我设置了一个向导输入表单,我称之为Quote.cshtml.在Quote.cshtml后面,我建立了一个名为QuoteModel.cs的模型.
Quote.cshtml最基本的(我省略了所有的向导逻辑,只显示一个输入):
<td width="40%">
@Html.LabelFor(m => m.FirstName, new { @class = "mylabelstyle", title = "Enter first name." })
</td>
<td width="60%">
@Html.TextBoxFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
</td>
Run Code Online (Sandbox Code Playgroud)
QuoteModel.cs(再次,只显示一个输入; nb:使用DataAnnotationExtensions)
public class QuoteModel
{
[Required(ErrorMessage = "First Name required.")]
[Display(Name = "First Name:")]
public string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试集成MvcMailer,它设置了IQuoteMailer.cs,QuoteMailer.cs,_Layout.cshtml和QuoteMail.cshtml.QuoteMail.cshtml是邮件的收件人最终会看到的内容.我还设置了一个QuoteController.cs,我在其中放置了MvcMailer所需的相应代码.它位于QuoteMailer.cs和QuoteController.cs中,我在从Quote.cshtml(基于QuoteModel.cs中的模型)传递用户输入时遇到问题.
IQuoteMailer.cs:
public interface IQuoteMailer
{
MailMessage QuoteMail();
}
Run Code Online (Sandbox Code Playgroud)
QuoteMailer.cs:
public class QuoteMailer : MailerBase, IQuoteMailer
{
public QuoteMailer():
base()
{
MasterName="_Layout";
}
public virtual MailMessage …Run Code Online (Sandbox Code Playgroud) 我想在类库中使用MvcMailer,这本质上是我为我的解决方案编写和发送电子邮件的一站式商店.我认为这就是MvcMailer的设计目标,但它似乎无法找到我的任何.cshtml文件 - 我想它希望它们在我的启动项目中.
MvcMailer有没有办法与我的其他项目100%分开?
谢谢.
将我的一个网站升级到MVC 4并升级NuGet中的所有软件包后,我似乎丢失了NuGet的MvcMailer软件包的Send()扩展方法.除了升级项目所需的代码之外,我没有进行任何代码更改,我有:
using Mvc.Mailer;
Run Code Online (Sandbox Code Playgroud)
在我的代码文件的顶部.
有人可以告诉我这里可能会发生什么吗?
我有一个基本上只是一个MVC项目的项目,因为它为Razor视图和库(Mvc.Mailer)提供了智能感知HttpContext.现在我必须加载一个页面,以便我MvcApplication的运行中的构造函数,或者Application_Start,或Init.
有没有办法引导mvc app main方法,或者在不要求我发送页面加载请求的任何页面请求之前调用的任何东西?
MVCMailer使用web.config文件中的smtp设置,如下所示:
<system.net>
<mailSettings>
<smtp from="some-email@gmail.com">
<network enableSsl="true" host="smtp.gmail.com" port="587" userName="some-email@gmail.com" password="valid-password" />
</smtp>
</mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud)
控制器:
public virtual MvcMailMessage Welcome()
{
//ViewBag.Data = someObject;
return Populate(x => {
x.ViewName = "Welcome";
x.To.Add("some-email@example.com");
x.Subject = "Welcome";
});
}
Run Code Online (Sandbox Code Playgroud)
无论如何在代码中设置SMTP设置?我想避免在web.config文件中保存密码.
mvcmailer ×10
c# ×6
asp.net-mvc ×3
.net-4.0 ×1
actionmailer ×1
asp.net ×1
html-email ×1
model ×1
moq ×1
razor ×1
smtpclient ×1
unit-testing ×1
view ×1