如何将数据从注册操作方法传递到MVC 5中的自定义html电子邮件操作

问题描述 投票:2回答:2

我一直在尝试将数据从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。我需要做些什么才能让它发挥作用?

c# asp.net-mvc html5 asp.net-mvc-5.2
2个回答
2
投票

提供的原始代码过度设计。

绝对没有必要使用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);

    //...
}

1
投票

你必须在获得它之前设置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);
    [...]
}
© www.soinside.com 2019 - 2024. All rights reserved.