![](/img/trans.png)
[英]how can I prevent the user leaving the page when hitting the browser back button in Jquery Mobile?
[英]How can I prevent the browser back button from reshowing my user notification?
我已经为我一直在研究的ASP.NET MVC3站点构建了一个通知系统,让用户知道他们执行的各种操作成功发生了(“拍拍背”消息)。 解决方案效果很好,但我有一个问题,我很乐意解决,但我似乎无法解决如何做到这一点。
在控制器中,我有以下示例操作方法:
<HttpGet()>
Public Function Edit(id As Guid) As ActionResult
Return View(GetMyViewModel(id))
End Function
<HttpPost()>
Public Function Edit(...) As ActionResult
' Save updated ... information
Me.TempData("UserMessage") = "Data Saved! You are truly an awesome user!"
' PRG back to Edit
Return RedirectToAction("Edit")
End Function
然后在我的视图(剃刀布局)中,我有代码查找TempData
集合中"UserMessage"
键的存在,如果它存在,我构建了一些JavaScript来为用户呈现类似于咆哮的通知:
/* This only exists when we have something to show */
$(function () {
showNotification([the message from TempData]);
});
然后,类似咆哮的消息要么随着时间消失,要么用户可以点击消息来消除它。
到目前为止一切顺利,一切都按预期工作。 用户POST到Edit
,他们被RPG回到Edit
,咆哮的“ 数据保存!你真是一个真棒用户! ”消息显示和解雇。
如果用户然后导航到另一个页面,然后点击浏览器的后退按钮,则浏览器会深入到其缓存中,导致浏览器执行相同的javascript,向用户显示相同的“ 数据已保存!您真是一个非常棒的用户! ”消息再次。 这让用户感到困惑,认为通过单击后退按钮,他们只是做了一些导致又一次保存的事情(或者无论消息是什么)。
我正在寻找一种方法,一旦通知显示一次,我可以以某种方式阻止通知显示备份 - 基本上使它成为“一次性拍摄”消息。 我想到的是:
Guid
,并使用localStorage存储显示的消息ID列表,并且只有当所请求的消息不存在于显示的消息列表中时,才显示它。
Guid
。 然后在页面加载时,AJAX返回服务器以获取该消息。 获得消息后,将从数据库中删除该消息,通过不返回任何消息来处理对该相同消息的后续请求。 Guid
,在显示消息之前,AJAX返回服务器以查看消息是否已经显示。 显示消息后,AJAX返回服务器以记录消息已显示。 这些对我来说似乎都是站不住脚的,但如果有人想争论支持其中之一,我可以说服不然。
我尝试过的事情:
.data()
属性以指示消息已显示,然后在显示消息之前,确保.data()
字段不存在。 这些不起作用,因为浏览器在一个时间点缓存页面,之后发生这两个DOM更改。
基本上,我需要一个机制,我的javascript可以检查它是否真的需要显示这个给定的消息,如果它,显示它,但然后标记消息如图所示,如果要求再次显示它,它没有。 有什么建议?
您还可以利用浏览器记住表单值的事实,简单示例:
<input id="notification" style="display:none" value="Data Saved!">
<script type="text/javascript">
$(function () {
if($('#notification').val())
{
alert($('#notification').val());
$('#notification').val('');
}
});
</script>
您可以设置cookie以存储正在显示的消息的状态,并在您尝试显示消息时检查cookie是否存在。 如果cookie在那里,你就不会,如果不是,你就可以。
看起来像这样的逻辑非常简单,而不是跟踪GUID :)
// pseudocode
FUNCTION ShowMessage(args)
// if the cookie is here, don't show the message
IF StatusCookieIsPresent THEN RETURN
// if the cookie isn't here, this is the first time showing the message
ShowStatusMessage()
// we showed the message, so set the cookie to make sure we don't
// do it twice
SetStatusCookie()
END FUNCTION
我不是MVC的专家,但我会尽力帮助你。 我3年前制作了一个Hello World计划,并阅读了很多相关内容。 :-)你在你的页面中使用AJAX历史记录(在查询字符串中使用#符号 - 雅虎打破了他们新的YUI邮件框架的功能,或忘记了当你点击后退按钮时 - 发送到登录页面哈哈)? 当您单击后退按钮时,您是来自不同的页面还是同一页面来显示您的消息? 我不太了解Razor框架可以完全帮助你。
起初我以为你可以通过使用这个代码轻松地在页面上禁用缓存,但后来我发现你正在使用AJAX,所以这可能不是一个足够好的解决方案。
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="0">
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
这会完全关闭它,但出于性能原因可能不是一个好的解决方案。
<caching>
<outputCache enableOutputCache="false" />
</caching>
您可以阻止显示来自您的集合的用户消息的页面的缓存,但我不知道您的AJAX中发生了什么以确定。
Response.CacheControl = "No-Cache"
不确定MVC是否会尊重这一点,但值得一试:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;
if (Response.Cache.VaryByParams["Category"])
{
//...
}
或者,也许那个页面是填充中间的甜甜圈,它太满了(对于浏览器后退按钮) - 没有双关语意图。 把它变成甜甜圈,它可以解决你的问题。 基本上,您可以实现包含您显示的消息的视图控件。 并从此视图控件中删除缓存策略。 我想它会在理论上起作用。 希望它在现实生活中适合你。
http://haacked.com/archive/2009/05/12/donut-hole-caching.aspx
OutputCache属性(在该文章中提到)仅控制给定用户控件的缓存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.