【问题标题】:How can I add a random number to an ASP.NET menu item url on each click如何在每次单击时向 ASP.NET 菜单项 url 添加随机数
【发布时间】:2011-08-24 13:47:08
【问题描述】:

防止缓存的一个步骤(除了添加适当的标头等)是在我的 URL 末尾添加一个随机数。

我正在使用 ASP.NET 菜单,并希望在每个菜单项的导航 URL单击时添加一个随机数

我可以在 MenuItemDataBound 事件中执行此操作,但在 MenuItemClicked 事件中执行此操作的运气并不好。

回答(8 小时无法回答我自己的问题,而且我没有时间等那么久,所以这是我的服务器端解决方案。)

要在服务器端执行此操作,我必须从菜单中删除站点地图和数据绑定。

我只是将站点地图中的所有项目作为菜单项添加到菜单标记中的项目集合中,删除了 url 属性。这里的关键是删除 url 属性。

<asp:menu>
  <items>
    <asp:menuitem Text="Home" ToolTip="Go Home" Selectable="True" />
  </items>
</asp:menu>

然后在您后面的代码中,您可以处理 MenuItemClicked 事件(现在应该触发,因为标记中不再有 navigateurl)。

在 MenuItemClicked 事件代码隐藏中,我只需执行以下操作:

string TimeStamp = DateTime.Now.ToString("yyyyMMddHHmmssfffffff");
// get iframe control - must have 'runat=server' attribute
HTMLControl display = CType(this.FindControl("display"), HTMLControl);
// dispatch menuitem
switch (e.item.valuepath)
{
  case "Home":
    display.attributes("src") = "home.aspx?=" + TimeStamp()
    break;
  .
  .
  .
}

这是带有 iframe 的服务器端解决方案。

【问题讨论】:

  • 添加标题还不够吗?这种做法是通过 AJAX 获取/发布来完成的,但对于常规的、每天可点击的 URL,它应该是不需要的。您是否遇到与缓存相关的问题?
  • 似乎添加标头是不够的,因为代理服务器似乎仍在缓存页面。在与网络管理员交谈后,他建议添加随机数......
  • 您是否需要将此作为服务器端解决方案?如果可以的话,你可以很容易地用一点 jQuery 将时间戳附加到你的 URL 客户端。
  • 这可能是一个选择,我希望同时了解客户端和服务器端的解决方案。

标签: asp.net menu menuitem


【解决方案1】:

我不知道您是否考虑将客户端 URL 操作作为一个选项,但在每个页面加载时运行这一点 JavaScript 将通过为每个页面附加时间戳来提供您正在寻找的行为链接。您可以将其修改为指向站点特定区域/div 中的链接,但此示例将全部更改:

<!-- include the jQuery library -->
<script type="text/javascript">
    $(function(){
        var time = new Date().getTime();
        $('a').each(function() {
            var append = (this.href.indexOf('?') > -1 ? '&' : '?');
            $(this).attr('href', this.href + append + 't=' + time.toString());
        });
    });
</script>

由于每次页面加载的时间戳都会不同,因此您应该始终获得一组唯一的链接。

编辑这是一个演示行为的工作 jsFiddle:http://jsfiddle.net/2HzqU/2/

【讨论】:

    【解决方案2】:

    我认为这不是最好的解决方案。您是否尝试过使用这样的东西:

    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Cache.SetNoStore(); 
    

    【讨论】:

    • 是的,正如我在原始帖子中所说,但是,这似乎不适用于此代理服务器的所有情况。
    • 听起来是时候换一个新的代理服务器了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2015-09-25
    • 2021-09-09
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多