【问题标题】:Is TempData the best place to store a saved successfully/unsuccessfully message?TempData 是存储成功/失败消息的最佳位置吗?
【发布时间】:2015-02-02 21:13:15
【问题描述】:

我正在 Azure 网站中实现 ASP.NET MVC post/redirect/getpattern。当用户创建新实体时,他们会从创建视图重定向到编辑视图,并将新对象 ID 作为 url 的一部分。

实体有很多字段,因此多次保存并向用户保证他们的数据正在保存的情况并不少见,我们使用 javascript 显示“保存成功”消息。

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Branch branch, int orgs)
    {
        if (ModelState.IsValid)
        {
            // model is valid, save it and redirect to edit
            _branchRepository.Save(branch);
            TempData["Message"] = new NotificationViewModel(NotificationSeverity.Success, 
                                  "Saved", 
                                  "Saved successfully");
            return RedirectToAction("Edit", new { id = branch.Id });
        }

        // model is invalid, don't save it, let them have another go
        TempData["Message"] = new NotificationViewModel(NotificationSeverity.Warning, 
                              "I'm sorry, Dave.", 
                              "I'm afraid I can't do that.");
        ModelState.Clear();
        return View("Edit", branch);
    }  

我对 TempData 的理解是,存储在 TempData 中的任何数据都将在当前请求和下一个请求的整个生命周期中存在(或直到项目被明确删除),并且是放置您想要传递的数据的最佳位置另一个查看您将重定向到的视图。

TempData 是此消息的最佳位置吗?

注意:我已经读到,如果您要对网络服务器进行负载平衡,则必须启用粘性会话。 Azure 是自动打开粘性会话还是需要手动配置?

【问题讨论】:

  • 这是一个关于 Azure 和 Get 的好问题。为了安全起见,我倾向于将可选参数传递给 Redirect 方法,而不是使用 TempData。我很想看看其他人的帖子。
  • 默认情况下 TempData 是基于会话的,但是您可以提供 TempDataProvider 的自定义实现,它可以将参数存储在 URL、Cookie 或其他地方
  • Neil,可选参数是否出现在 url 中?如果是这样,并且我为该网址添加了书签,那会不会导致每次打开该书签时都会显示“已成功保存”消息?

标签: asp.net-mvc tempdata


【解决方案1】:

在我看来,在 TempData 中使用 PRG 模式时在请求之间存储验证消息是 TempData 最流行的用法。此外,您可以编写一些操作过滤器,如果您返回重定向结果,它们将自动将所有模型状态存储在 tempdata 中,如果您在 Get 阶段返回视图,则将该数据从 tempdata 移动到模型状态/视图状态。

MVC Contrib 中有两个这样的过滤器: http://mvccontrib.codeplex.com/SourceControl/latest#src/MVCContrib/Filters/ModelStateToTempDataAttribute.cs http://mvccontrib.codeplex.com/SourceControl/latest#src/MVCContrib/Filters/TempDataToViewData.cs

存储在 TempData 中的数据在读取它的请求结束后被删除,直到您调用 TempData.Keep(key)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多