Pap*_*ndy 25 html model-view-controller asp.net-mvc scroll-position
我正在MVC的一个项目上工作,并喜欢学习它.有一些成长的痛苦,但一旦你弄清楚它并不坏.WebForms世界中一件非常简单的事情就是保持页面上的滚动位置.您所做的只是将MaintainScrollPositionOnPostback属性设置为true.但是,在MVC中,我没有使用回发,所以这对我不起作用.处理这个问题的标准方法是什么?
编辑: Ajax是可以接受的,但我也想知道如何在没有AJAX的情况下完成它.
Mad*_*aga 38
我在JS中解决了这个问题:
$(document).scroll(function(){
localStorage['page'] = document.URL;
localStorage['scrollTop'] = $(document).scrollTop();
});
Run Code Online (Sandbox Code Playgroud)
然后在文件准备好了:
$(document).ready(function(){
if (localStorage['page'] == document.URL) {
$(document).scrollTop(localStorage['scrollTop']);
}
});
Run Code Online (Sandbox Code Playgroud)
MaintainScrollPositionOnPostback的工作方式是它有一对隐藏字段:__SCROLLPOSITIONX和__SCROLLPOSITIONY
在回发上,它设置这些,
function WebForm_GetScrollY() {
if (__nonMSDOMBrowser) {
return window.pageYOffset;
}
else {
if (document.documentElement && document.documentElement.scrollTop) {
return document.documentElement.scrollTop;
}
else if (document.body) {
return document.body.scrollTop;
}
}
return 0;
}
function WebForm_SaveScrollPositionSubmit() {
if (__nonMSDOMBrowser) {
theForm.elements['__SCROLLPOSITIONY'].value = window.pageYOffset;
theForm.elements['__SCROLLPOSITIONX'].value = window.pageXOffset;
}
else {
theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();
theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();
}
if ((typeof(this.oldSubmit) != "undefined") && (this.oldSubmit != null)) {
return this.oldSubmit();
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
然后它调用RestoreScrollPosition:
function WebForm_RestoreScrollPosition() {
if (__nonMSDOMBrowser) {
window.scrollTo(theForm.elements['__SCROLLPOSITIONX'].value, theForm.elements['__SCROLLPOSITIONY'].value);
}
else {
window.scrollTo(theForm.__SCROLLPOSITIONX.value, theForm.__SCROLLPOSITIONY.value);
}
if ((typeof(theForm.oldOnLoad) != "undefined") && (theForm.oldOnLoad != null)) {
return theForm.oldOnLoad();
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
但正如大多数人所说,无论如何,MVC应该避免回发.
实际上没有标准的处理方式,这是微软支持他们的回发模式的黑客行为.他们需要这个,因为每个控件都会发回一个帖子,用户会不断被推回到页面顶部.
与MVC一起使用的建议是使用AJAX将大部分回发到服务器.这样页面就不必重新渲染焦点就不会移动.jQuery使AJAX非常简单,甚至还有默认表单
<% Ajax.BeginForm(...) %>
Run Code Online (Sandbox Code Playgroud)
哪个将为您处理AJAX方面的问题.