【问题标题】:Refresh Page on Back Click - MVC 4返回单击时刷新页面 - MVC 4
【发布时间】:2014-04-24 06:18:48
【问题描述】:

当我点击此页面时,强制我的ActionResult 始终触发的简单方法是什么?例如,在浏览器返回点击时,这不会执行。

public ActionResult Index()
{
    //do something always

    return View();
}

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    ActionResult 上禁用缓存会强制页面每次刷新而不是呈现缓存版本。

    [OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]
    public ActionResult Index()
    {
        //do something always
    
        return View();
    }
    

    现在,当您单击浏览器的返回按钮时,每次都会被点击。

    【讨论】:

    • 如何使用VaryByParam = "None" 提到的here 可以吗?
    【解决方案2】:

    你可以试试onunload事件和ajax:

    <script>
       window.onunload = function () {
          $.ajax({
             url: '/ControllerName/Index',
             type: 'POST',
             datatype: "json",
             contentType: "application/json; charset=utf-8"
          });
       };
    </script>
    

    【讨论】:

    • 我想过这样的事情,但不确定尝试重定向 onunload 是否是个好主意。有什么我应该关心的,或者这是一个可以接受的跨浏览器的事情吗?另外,我怎么知道用户正在尝试返回?我不想总是重定向到这个页面。
    • 您唯一应该关心的是您的操作将在浏览器后退按钮单击和刷新按钮单击时调用。即使您在页面上进行了一些回发。我曾经遇到过这个问题,这是我可以解决的唯一方法。 stackoverflow.com/q/21400594/2174170
    • 谢谢,您的问题的链接很有帮助。不过,我认为我不需要采取如此激进的方法。我可以在我的索引的就绪事件中处理一些事情,而不是在离开下一页时(只是还不知道它是什么)。如果我不需要的话,我宁愿不要触摸默认的后点击行为:)
    【解决方案3】:

    将此代码添加到我的 HTML 对我来说效果很好:

    <input id="alwaysFetch" type="hidden" />
    <script>
        setTimeout(function () {
            var el = document.getElementById('alwaysFetch');
            el.value = el.value ? location.reload() : true;
        }, 0);
    </script>
    

    这对于那些不想处理服务器端代码而不是接受的解决方案的人来说可能会派上用场。

    它所做的只是在第一次加载时为隐藏输入分配一个值,该值将在第二次加载时保留,在这种情况下页面会被强制刷新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 2015-07-05
      相关资源
      最近更新 更多