I use .scrollTop like shown below, very easy, it even works with multiple forms in the view (I have a very long view, broken down into multiple forms):
First put this property inside the model:
public string scrollTop { get; set; }
And in the view, inside Form #1:
@Html.HiddenFor(m => m.scrollTop, new {@id="ScrollForm1"})
inside Form #2:
@Html.HiddenFor(m => m.scrollTop, new {@id="ScrollForm2"})
inside Form #2:
@Html.HiddenFor(m => m.scrollTop, new {@id="ScrollForm3"})
and then at the bottom of the view:
$(document).ready(function () {
$(document).scrollTop(@Model.scrollTop);
$(document).scroll(function () {
$("#ScrollForm1").val($(document).scrollTop());
$("#ScrollForm2").val($(document).scrollTop());
$("#ScrollForm3").val($(document).scrollTop());
});
});
Your scroll position is always preserved upon postback because the @Html.HiddenFor fields store your current scroll and pass it to the model on post. And then, when the page comes up it gets the scrollTop value from the model. At the end your page would behave like webform, everything stays intact.