1

我正在为我目前正在构建的网站使用 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 持久化到另一个。

4

2 回答 2

1

您可以完全避免临时数据和会话,而是将文本存储在视图模型的属性中,这通常比使用会话更好。我假设您将消息存储在临时数据中,以便稍后将其显示给用户。然后,您可以改为执行以下操作:

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 结合以在不刷新页面的情况下显示消息(通过将页面上的现有 div 替换为 ajax 响应,这将是局部视图)。如果文本不是动态的并且始终相同,您也可以直接将其放在局部视图中,而不是将其存储在模型中。

于 2013-09-18T22:41:27.860 回答
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;

你明白了..不是临时数据的忠实粉丝......

于 2013-09-18T15:17:53.493 回答