使用TempData时发生电子邮件问题

时间:2013-09-18 14:40:57

标签: c# asp.net-mvc asp.net-mvc-4 razor tempdata

我正在使用MVC 4,C#和Razor建立一个我正在建设的网站并遇到一个奇怪的问题。

问题与以下代码有关:

Mailer.EmailAdmin(this, model);
Mailer.EmailUser(this, model);

TempData["Message"] = "Your request has been forwarded to the appropriate administrator." 
+ " \n You will be notified when the application has been processed.";

上述两种方法均达到各自的断点,数据按预期传递给相关模型。但是,尽管这两种方法似乎只能发送一封电子邮件,但这始终是“EmailUser”(无论管理员或用户电子邮件是否放在首位)。请注意,减去邮件中不同的视图,发送电子邮件的代码完全相同。

一旦从代码中删除'TempData',两封电子邮件都会毫无问题地发送。

有没有人对可能发生这种情况的原因提出任何建议?如果他们是一个可能的解决方案?

我没有使用MVCMailer,而是使用典型的字符串构建器以电子邮件格式呈现视图。 TempData仅用于需要从ActionResult持久保存到另一个。

2 个答案:

答案 0 :(得分:1)

我喜欢把物体从动作带到动作...... 创建一个类......

    public class MessageModel
    {
        public virtual string Message { get; set; }
    }

在我的第一个行动结果中..

 var mModel = new SelectionModel.MessageModel
            {
                Message = "my message"
            };

        Session["mModel "] = mModel;  

如果您想要或继续使用相同的消息,请更改消息...

 var mmModel = (SelectionModel.MessageModel)Session["mModel"];
        mmModel.Message = "new message";
        Session["mModel"] = mmModel;

你明白了......不是tempdata的忠实粉丝......

答案 1 :(得分:1)

您可以通过将文本存储在视图模型的属性中来完全避免tempdata和会话,这通常比使用会话更好。我假设您将消息存储在临时数据中,以便稍后将其显示给用户。然后你可以做这样的事情:

public ActionResult SendEmail(MyModel model) {
    Mailer.EmailAdmin(this, model);
    Mailer.EmailUser(this, model);

    MyOtherModel otherModel = new MyOtherModel();
    otherModel.Message = "Your request has been forwarded to the appropriate administrator." 
    + " \n You will be notified when the application has been processed.";

    return View("MyView", otherModel);
}

当然,如果应用相同的模型,您也可以使用相同的模型,或者返回部分视图而不是完整视图。使用局部视图,您可以将其与ajax组合以显示消息而无需刷新页面(通过使用ajax响应替换页面上的现有div,这将是部分视图)。如果文本不是动态的并且始终相同,您也可以直接将其放在局部视图中,而不是将其存储在模型上。