在网络表单中,我使用MailDefinition类发送电子邮件模板。我怎样才能对MVC做同样的事情?
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus =
MembershipService.CreateUser(model.UserName, model.Password, model.Email);
if (createStatus == MembershipCreateStatus.Success)
{
// TODO: Send email verification code go here?
//FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
return RedirectToAction("Index", "Home");
}
else
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
// If we got this far, something failed, redisplay form
return View(model);
}
我正在寻找符合MVC设计模式的解决方案,不确定如何去做。
答案 0 :(得分:1)
我创建了一个基本控制器,它有一个虚拟方法sendEmail(MyBaseViewModel模型),可以在继承的控制器上覆盖,但具有在视图模型中查找Email,FromEmail和Subject的逻辑,如果找到则设置sendMail布尔值为true并在viewmodel中查找AlternateEmailView字符串。
然后我有一个自定义视图结果,它查找sendMail属性的真实性,然后实际呈现视图(或备用视图)并发送电子邮件,然后将普通视图呈现给浏览器。似乎工作得很好,并允许我将我的电子邮件内容视为另一种维护视图。
我应该补充一点,我的视图名称中也有一个约定,这样如果我不提供AlternateEmailView属性,它会查找ViewName_Email,然后发送普通视图,如果找不到。
哈尔
答案 1 :(得分:1)
imo,最好的方法是通过合成来解决,而不是继承。
我通常有一个我使用的INotifier接口,它有一个接受用户,标题和正文的Notify方法。然后,我可以手动将INotfier设置为我的EmailNotifier实现,或者通过构造函数或通过IoC容器传递它。
在任何情况下,我的EmailNotifier实现都会从正文中提取用户的电子邮件,并使用System.Net.Mail命名空间邮件对象发送电子邮件。这有一个额外的好处,System.Net.Mail已经为你找到了如何从配置文件中获取所有电子邮件设置,所以你有一个地方设置/更新设置。
我通常还有一个NullNotifier,它实现了INotifier但什么也没做,所以我的控制器可以安全地调用notifier.Notify(用户,标题,正文)而不用担心NRE。
这里有关于System.Net.Mail的更多信息:http://www.systemnetmail.com/