我正在使用 AJAX 调用来请求部分视图并将其 html 加载到我的主索引视图的内容区域中。我正在利用 url 中的哈希来启用浏览器历史记录支持(与 GMail url 浏览器历史记录的工作方式相同)。
一切正常,除了返回并加载我的部分视图后,MVC 似乎正在清除我的 url 哈希符号之后的所有内容,这会影响 javascript 浏览器历史堆栈。
我的主视图上有一个链接,它启动了请求:
<div class="linkButton" data-bind="click:function(){Nav.makeRequest('#/MyController/Profile/2')}">Profile</div>
这是我用来请求和加载部分视图的 javascript:
var Nav:function(){
var self = this;
$(window).bind("hashchange", self.onHashChange);
makeRequest: function(hash){
window.location.hash = hash;
};
onHashChange: function (e) {
var hash = window.location.hash.substring(1);
var url = 'http://localhost:3333/' + hash.substring(1);
$.get(url, function (data) {
$('#content').html(data);
});
}
}
因此,我的示例请求之一是:http://localhost:3333/#/MyController/Profile/2
请求成功完成,我的 Profile 视图加载了正确的模型,用于在路由中传递给它的 id ( 2 ),浏览器导航中的 url 如上所示。
然而,在视图完成加载后,浏览器的 url 会自动更改为:http://localhost:3333/#
这不会影响页面上当前加载的内容,但它会将这个新 url 添加到浏览器的历史记录中,因此当我点击“返回”按钮时,它会再次发送部分配置文件视图的请求。
我在 Global.axax 中的唯一路线如下:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "MyController", action = "Index", id = UrlParameter.Optional }
);
我怀疑 MVC 路由引擎看到我对部分视图的请求进入 ( http://localhost:3333/MyController/Profile/2
),然后将其与返回我的索引视图的 url 的默认路由匹配,这当然是:http://localhost:3333/
我已经在客户端上进行了广泛的调试,并且 onHashChange 事件确实两次触发,一次是针对部分视图请求,然后是当 url 更改回 localhost:3333/# 调用堆栈没有显示任何客户端调用导致 url 变回。
有没有一种方法可以让我使用 AJAX 请求和加载我的部分视图,并使用哈希来支持历史记录,并且让浏览器的 url 不会自动路由回默认路由路径?