2010-10-07 85 views
10

在带有tabstrip的ASP.NET页面上,我使用URL中的哈希代码来跟踪我所在的标签(使用BBQ jQuery plugin)。例如:ASP.NET回发在URL中丢失哈希

http://mysite.com/foo/home#tab=budget 

不幸的是,我刚刚意识到,有一对夫妇在页面上的地方,我使用的是老式的ASP.NET回发做的东西,并回传完成时,哈希消失:

http://mysite.com/foo/home 

...所以我接走不同的标签。不好。

这是一个使用.NET 4.0的webforms网站(而不是MVC)。正如你所看到的,虽然,我正在使用URL路由。

有没有一种方法可以告诉ASP.NET将哈希保留在回传后的URL中?

回答

15

问题是,回发转到当前页面的url,该页面是在页面上的表单的动作中设置的。默认情况下,此网址在asp.net中没有#hash,并且由asp.net自动设置,您无法控制它。

你可以使用JavaScript的#hash添加到形式的行动属性:

document.getElementById("aspnetForm").action += location.hash 

,或者,如果它已经更新与哈希值的动作:

var form = document.getElementById("aspnetForm"); 
form.action = form.action.split('#')[0] + location.hash 

只是确保你执行这个代码在window.load上,你的目标是正确的ID

+0

谢谢,我会试试看。 – 2010-10-08 13:15:34

2

我试图把代码从Willem's answer到一个JS函数,每次调用一个新的标签是一个ctivated。这不起作用,因为每次切换标签页时,它都会在URL上附加额外的#hash部分。

我的网址最后变成http://myurl.example.com/home#tab1#tab2#tab3#tab2(等)

我修改了代码稍微从<form>元素的action属性中的URL删除任何现有#hash组件,附加上新的人之前。它也使用jQuery来查找元素。

$('.nav-tabs a').on('shown', function (e) { 
    // ensure the browser URL properly reflects the active Tab 
    window.location.hash = e.target.hash; 

    // ensure ASP.NET postback comes back to correct tab 
    var aspnetForm = $('#aspnetForm')[0]; 
    if (aspnetForm.action.indexOf('#') >= 0) { 
     aspnetForm.action = aspnetForm.action.substr(0, aspnetForm.action.indexOf('#')); 
    } 
    aspnetForm.action += e.target.hash; 
}); 

希望这可以帮助别人!

+0

请注意,当您使用'UpdatePanel'时,'action'标签将被更新,因此您也必须在'EndPostbackRequest' javascript事件中执行此操作。 – modiX 2016-08-12 10:21:19

1

我有另一种解决方案,用铬,IE和safari实施和测试。

我使用“localStorage”对象,它假设所有浏览器都支持localStorage。

在选项卡的单击事件上,我将currentTab值存储到本地存储。

$(document).ready(function() { 
     jQuery('.ctabs .ctab-links a').on('click', function(e) { 
      var currentAttrValue = jQuery(this).attr('href'); 
      localStorage["currentTab"] = currentAttrValue; 

      // Show/Hide Tabs 
      jQuery('.ctabs ' + currentAttrValue).show().siblings().hide(); 

      // Change/remove current tab to active 
      jQuery(this).parent('li').addClass('active').siblings().removeClass('active'); 

      e.preventDefault(); 
     }); 
     if (localStorage["currentTab"]) { 
      // Show/Hide Tabs 
      jQuery('.ctabs ' + localStorage["currentTab"]).show().siblings().hide(); 
      // Change/remove current tab to active 
      jQuery('.ctabs .ctab-links a[href$="' + localStorage["currentTab"] + '"]').parent('li').addClass('active').siblings().removeClass('active'); 
     } 
    });