asp.net-mvc-3 - 使用 ASP MVC TempData 向用户显示消息时出现问题

标签 asp.net-mvc-3 razor tempdata

我正在使用 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/

相关文章:

c# - MVC 4 为什么我必须在服务器上而不是本地序列化?

javascript - Jquery:在引用的 js 文件中启用 DOM 就绪函数

visual-studio-2010 - 命名空间 'Model'的类型在命名空间中不存在

c# - 在 asp.net mvc 应用程序中从 Javascript 访问 C# 变量

c# - Razor C# - 从数据库中获取数据

asp.net-mvc - asp.net mvc 和网络农场

javascript - 将函数回调绑定(bind)到kendo网格上

asp.net - 将 MVC 2 转换为 MVC 3 后,我得到了 : Could not load type 'System.Web.Mvc.ViewTypeParserFilter'

c# - Foreach 找不到嵌套类

c# - 存在临时数据未清除的问题