我正在使用 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 或使用更适合我们目的的东西。
最佳答案
本质上,您希望 TempData 执行您想要的操作,而不是使用正确的工具来执行您想要的操作。
根据设计,TempData 旨在用于跨 HTTP 重定向缓存数据。这就是它存在的目的。从您的帖子中不清楚这是否是您正在使用的场景。
即:
页面重定向,数据位于 TempData 中,然后显示给用户。刷新你到达的页面,TempData已经不存在了(没有重定向,只是刷新)。
如果用户随后导航到另一个页面,然后使用后退按钮,浏览器将缓存您页面的 html 并重新显示该页面。这是正确的行为。
我还认为,在您的测试中,您弄错了。也就是说,通过禁用缓存,您只是完全删除了 TempData,并且不会获得正确的行为。即,该消息永远不会出现,而不仅仅是当您点击后退按钮时。
你的 jQuery 看起来效率很低。你让它做一些它不需要做的事情。您可以使用 razor 用您的消息填充您的 div。设置div不显示,即:
<div id="commonMessage" style="display:none;">
然后使用jQuery来显示它:
$('#commonMessage').show();
您的帖子不太清楚,但总而言之,我想说您正在看到您应该看到的内容。
也许您应该在编辑中描述您希望应用程序执行的操作。这样就更容易回答了。就目前情况而言,您已经告诉我们发生了什么以及您的看法,但尚不清楚您的期望是什么。
您还应该更好地理解 TempData:它仅在 Controller 操作之间(即发生重定向时)持续存在。它将数据存储在 session 存储中,我相信这受到您提到的缓存属性的影响。
关于asp.net-mvc-3 - 使用 ASP MVC TempData 向用户显示消息时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6648167/