3

我正在使用 TempData 向用户显示一条消息。我在 TempData 中放入了一个字符串,然后我读取了该字符串,如果它不为空,则显示一个包含该消息的 DIV。

一切正常,如果用户刷新页面,则不会显示消息(这就是我想要的)。问题是,如果用户导航到其他页面,然后在浏览器中按下后退按钮,则消息会再次显示,我不希望这样。

我能做些什么来避免这种行为?

谢谢。

这是我用来读取 TempData (Razor + VB) 的代码。有一个 DIV #commonMessage,使用此代码,我将字符串放在 div 中并显示它。正如我之前所说,它正在工作,但唯一的问题是如果用户在浏览器中单击返回,TempData 仍然存在。

 @If Not IsNothing(TempData("MessageUser")) AndAlso TempData("MessageUser") <> String.Empty Then
        Dim str As String = TempData("MessageUser")
        @<script type="text/javascript">
             $(document).ready(function () {
                 $('#commonMessage').html("@str");
                 $('#commonMessage').delay(400).slideDown(400).delay(4000).slideUp(400);
             })
        </script>
    End If

编辑:似乎 TempData 被捕获,因为如果我为显示消息的操作禁用缓存(使用属性System.Web.Mvc.OutputCache(NoStore:=True, Duration:=0, VaryByParam:="*")),问题就会消失。但最好我能找到一种不涉及禁用缓存的方法......

要求编辑:我在 ASP 方面很新,所以我试图澄清我正在尝试做的事情。当用户执行操作(例如,编辑客户端)时,我将客户端重定向到客户端列表页面,并显示一条消息告诉用户“客户端数据已成功更新”。我正在尝试以一种使消息只显示一次的方式来做到这一点。也许 TempData 不是正确的方法(我不知道,因为我还在学习),但目标是只向用户显示一次消息(无论用户是否刷新或用户去其他页面,然后在浏览器中按回)...使用 TempData 或使用更适合我们目的的东西。

4

1 回答 1

1

本质上,您希望 TempData 做您想做的事,而不是使用正确的工具来做您想做的事。

TempData 在设计上旨在用于跨 HTTP 重定向缓存数据。这就是它存在的目的。从您的帖子中不清楚这是否是您正在使用的场景。

IE:

页面重定向,带有 TempData 中的数据,然后显示给用户。刷新您到达的页面,TempData 不再存在(没有重定向,只是刷新)。

如果用户然后导航到另一个页面,然后使用后退按钮,浏览器将缓存您页面的 html 并重新显示。这是正确的行为。

我也认为在你的测试中,你弄错了。即,通过禁用缓存,您只是完全取消了 TempData,您将无法获得正确的行为。即,该消息将永远不会出现,而不仅仅是在您按下后退按钮时。

您的 jQuery 看起来效率低下。你让它做它不需要做的事情。您可以使用 razor 用您的消息填充您的 div。设置div不显示,即:

<div id="commonMessage" style="display:none;">

然后用jQuery来展示它:

$('#commonMessage').show();

你的帖子不是很清楚,但总而言之,我会说你看到了你应该看到的。

也许您应该在编辑中描述您希望您的应用程序做什么。这样就更容易回答了。就目前情况而言,您已经告诉我们会发生什么以及您认为什么,但不清楚您的期望是什么。

您还应该更好地理解 TempData:它只在控制器操作之间持续存在,即发生重定向时。它将其数据存储在 Session 存储中,我相信这会受到您提到的缓存属性的影响。

于 2011-07-11T12:16:50.457 回答