Jquery 如何从MVC控制器的OnActionExecuting中获取History.js URL的哈希部分
我有一个自定义jQuery控件,它使用History.js通过Ajax更改browserstate并加载子面板。在HTML5浏览器中,URl完全更改,因此页面刷新可以加载当前面板 但是,在IE9及更早版本中,状态存储为哈希值,如:Jquery 如何从MVC控制器的OnActionExecuting中获取History.js URL的哈希部分,jquery,ajax,asp.net-mvc,url,onactionexecuting,Jquery,Ajax,Asp.net Mvc,Url,Onactionexecuting,我有一个自定义jQuery控件,它使用History.js通过Ajax更改browserstate并加载子面板。在HTML5浏览器中,URl完全更改,因此页面刷新可以加载当前面板 但是,在IE9及更早版本中,状态存储为哈希值,如: http://localhost:63559/ApplicationPanel/ListView#/SectionPanel/ListView/3?&_suid=1397574319099025255064889015816 我想提取OnActionExec
http://localhost:63559/ApplicationPanel/ListView#/SectionPanel/ListView/3?&_suid=1397574319099025255064889015816
我想提取OnActionExecuting内部的hash URL,例如/SectionPanel/ListView/3,这样我就可以重定向到页面上的正确起点刷新后退和前进按钮操作正常
基本上我希望它这样做,但即使是原始URL也不包含哈希部分
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var url = filterContext.HttpContext.Request.RawUrl;
if (url.Contains('#'))
{
url = url.Substring(url.IndexOf('#')+1);
filterContext.Result = Redirect(url);
}
base.OnActionExecuting(filterContext);
}
如果我中断此代码,则url仅包含基本url,例如/ApplicationPanel/ListView
如何获取MVC控制器中的哈希参数?我想我可能还需要改变推送它们的方式,但以下几种变体没有帮助:
// If HTML4, try adding a querystring
if (typeof window.history.pushState !== "function")
{
url = "?" + url;
}
this.Historyjs.pushState({ somedata: data }, "", url);
我得到的URL如下:
http://localhost:63559/Level1#Level1/?/Level2/Index/3&_suid=139757562428301418756129738284
更新:
这似乎取决于History.js处理浏览器url的方式。在HTML4浏览器上,它只能修改哈希标记,这样服务器就不会看到额外的数据
作为测试,我让插件检查哈希URL,并将浏览器重定向到该URL:
// If HTML4, extract the URL from the hash
if (typeof window.history.pushState !== "function")
{
var hash = window.location.hash;
if (hash.length)
{
var q = hash.indexOf('?');
if (q < 1)
{
q = (hash.length);
}
hash = hash.substring(1, q);
window.location = hash;
}
}
虽然这对页面刷新有效,但不幸的是浏览器页面加载无法区分页面重新加载和按下后退按钮。这段代码一遍又一遍地将后退按钮发送到同一个子页面
有什么建议吗?我尝试了各种选择,但似乎没有什么能解决所有问题。最后,我求助于剥离页面加载上的任何哈希或按下后退按钮,因为我无法始终区分这两者 最终结果是: 在HTML4浏览器上,后退按钮和重新加载将返回顶层面板,并删除所有哈希引用。 在HTML5上,它与后退、前进和刷新完美结合,在层次结构的各个级别正确维护当前面板。 jQuery插件开头的代码
哈希部分未发送到服务器。不能改用url参数吗?编辑:抱歉,遗漏了问题的某些部分,看起来您已经尝试过了
// If HTML4...
if (typeof window.history.pushState !== "function")
{
// If there is a hash, remove it and redirect (to clean up the address bar)
var hash = window.location.hash;
if (hash.length)
{
window.location = <any>window.location.pathname;
return;
}
}