我正在构建一个 ASP.NET MVC3 应用程序,在搜索页面中,我使用 ajax 来获取和更新页面的结果部分。问题在于浏览器历史记录。例如,如果用户在结果的第 5 页,然后点击浏览器刷新,他会得到索引页(他应该刷新第 5 页)。浏览器的后退按钮也有同样的问题。我做了一些研究,发现了名为jQuery History的扩展。在他们的示例中,他们使用的是标签系统(隐藏和显示),与我的情况不同(分页)。这是我的简单代码:
提前致谢。
编辑: 我尝试使用Html 5 历史 API,但使用此代码不起作用,我注意到使用 FireBug,在第一页导航后(例如:到第 2 页),GET 方法被执行了两次!
编辑2:
调试时,我注意到在处理popstate
事件时,location.pathname
属性总是/Home/GoToPage
,但它应该有例如/Home/GoToPage?pageIndex=3
我的索引页面
<h2>Pages navigator</h2>
@Html.Partial("_Result")
我的结果部分视图
@model HistoryConcept.Models.Result
<aside id="content">
@{
var prevUrl = String.Format(@"/Home/GoToPage?pageIndex={0}", Model.PageNumber - 1);
var nextUrl = String.Format(@"/Home/GoToPage?pageIndex={0}", Model.PageNumber + 1);
<a id="goPrevious" href="@prevUrl">Previous page</a>
<a id="goNext" href="@nextUrl">Next page</a>
}
<div>Page number : @Model.PageNumber</div>
<div>@Model.PageContent</div>
</aside>
结果部分视图中的 javascript
<script type="text/javascript">
$(document).ready(function () {
window.addEventListener('popstate', function (e) {
getPage(location.pathname);
});
setupHistoryClicks();
});
function setupHistoryClicks() {
addClicker($('#goPrevious'));
addClicker($('#goNext'));
}
function addClicker(link) {
link.click(function (e) {
var linkHref = link.attr('href');
getPage(linkHref);
history.pushState(null, null, linkHref);
e.preventDefault();
});
}
function getPage(href) {
var req = new XMLHttpRequest();
req.open("GET", href, false);
req.send(null);
if (req.status == 200) {
$('#content').replaceWith(req.responseText);
setupHistoryClicks();
return true;
}
return false;
}
</script>
我的控制器
public ActionResult Index()
{
var model = new Result {PageContent = "This is the home page"};
return View(model);
}
public PartialViewResult GoToPage(int pageIndex)
{
var model = new Result
{
PageNumber = pageIndex,
PageContent = "New page content"
};
return PartialView("_Result", model);
}