.NETのちょっとマイナーな機能 その1

.NET Framewokクラスライブラリでは非常に多くの機能が提供されていますが、あまりに膨大であるため、MSDNを眺めているとこんな機能もあったのかと驚かされることがあります。私の独断と偏見でちょっとマイナーかなと思われる機能を紹介していこうと思います。
Page.MaintainScrollPositionOnPostBack プロパティ (System.Web.UI)
ビューステートによりクライアントの状態管理が自動で行われるASP.NETですが、ビューステートでも保持できない状態があります。それはスクロールバーの状態です。
このプロパティを True に設定すると、ポストバックしてもページのスクロール状態が保存されるようになります。

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" MaintainScrollPositionOnPostback="true" %>

実際にどのような仕組みでこの動作を実現しているのか見てみますと、隠しフィールドでスクロールのポジションをサーバーへ受け渡し、再表示時にjavascriptでその位置まで戻しているようです。
javascriptは、アセンブリから出力されるWebResource.axdの中にあり、メインとなるfunctionは下記のような感じです。

this.getScrollOffset = function(element, recursive) {
        var left = element.scrollLeft;
        var top = element.scrollTop;
        if (recursive) {
            var parent = element.parentNode;
            while (parent != null && parent.scrollLeft != null) {
                left += parent.scrollLeft;
                top += parent.scrollTop;
                                if (parent == document.body && (left != 0 && top != 0))
                    break;
                parent = parent.parentNode;
            }
        }
        return { x: left, y: top };
    }

この便利さは、実際に体感してみないと分かりづらいので、是非お試しあれ。

ちなみに、.NET 1.xではPage.SmartNavigation プロパティ (System.Web.UI)で実装されていて、スクロールとフォーカスの状態を保持するようになっていました。ただし、MaintainScrollPositionOnPostbackとは実装方法がまったく異なり、IE限定での動作という制限やバグなどもあるので、こちらは要注意です。