我一直在尝试将数据从Register操作传递到Account controller-MVC 5中的自定义html电子邮件操作。
注册行动:
public async Task<ActionResult> Register(RegisterViewModel model) {
string messageBody = IntroMail();
[...]
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
TempData["CallbackUrl"] = callbackUrl;
await UserManager.SendEmailAsync(user.Id, "Welcome Mail", messageBody);
[...]
}
要发送的自定义电子邮件:
private string IntroMail()
{
string body;
using (StreamReader reader = new StreamReader(Server.MapPath("~/App_Data/Templates/WelcomeMail.html")))
{
body = reader.ReadToEnd();
}
var activateUrl = Convert.ToString(TempData["CallbackUrl"]);
body = body.Replace("{callbackUrl}", activateUrl);
return body;
}
TempData为空,因此replace方法为null。我需要做些什么才能让它发挥作用?
提供的原始代码过度设计。
绝对没有必要使用TempData
字典。 IntroMail
似乎是一个本地函数,可以重构以期望显式依赖。
Explicit Dependencies Principle说: 方法和类应明确要求(通常通过方法参数或构造函数参数)所需的任何协作对象才能正常运行。
private string IntroMail(string callbackUrl) {
string body;
using (StreamReader reader = new StreamReader(Server.MapPath("~/App_Data/Templates/WelcomeMail.html"))) {
body = reader.ReadToEnd();
}
body = body.Replace("{callbackUrl}", callbackUrl);
return body;
}
并在调用时将值传递给方法。
public async Task<ActionResult> Register(RegisterViewModel model) {
//...
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
var messageBody = IntroMail(callbackUrl);
await UserManager.SendEmailAsync(user.Id, "Welcome Mail", messageBody);
//...
}
你必须在获得它之前设置TempData["CallbackUrl"]
。 IntroMail()
尝试读取此键,但只有在从此方法返回后才会设置它。设置此密钥后,您必须将调用移动到IntroMail()
。
public async Task<ActionResult> Register(RegisterViewModel model) {
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
TempData["CallbackUrl"] = callbackUrl;
string messageBody = IntroMail();
[...]
await UserManager.SendEmailAsync(user.Id, "Welcome Mail", messageBody);
[...]
}