14. ダウンロードカウンタ(+ページの遷移)

トップどんと来い! ASP.NET > 14. ダウンロードカウンタ(+ページの遷移)

めったに使わないコントロール

めったに使わないコントロール
を、ダウンロードカウンタでは使うことになります。そう、「LinkButton」コントロールです。

このコントロールは「コントロールのまとめ」でも
まるで無意味なコントロール
と紹介しましたが、ここではリンクとしてでなく、ボタンとして使います。

見かけ上は本当にリンクです。下線まで引いてあったりして、「リンク」そのものなのですが、これは「Button」類に属します。
なぜ、Button でなければならないか、それは「Click イベント」があるからです。

HyperLink を使おうと思ったのですが、こっちが正真正銘のリンクで、Click イベントがありませんでした。
このコントロールを使うことがわかれば、もう簡単ですね。カウンタそのものですから。

いや、今回のポイントは実はこの後に潜んでいるのです。

カウンタと同じではならないのは、クリックされたらファイルのある場所へジャンプしなければならないということです。
クリックしたのにダウンロードが始まらなければ、みんなは怒るでしょう。カウンタは増えていくのに、ダウンロードはできない....。

ここで初めて「ページの遷移」という分野が必要となります。ここでマスターしておきましょう。といっても、簡単ですけどね。
Response.Redirect("ジャンプするページ・アドレス");

これでジャンプします。このステートメントを実行すると、直接ジャンプするのではなく、「Redirect」ですから、いったんサーバに情報が返されます。
すなわち、
・Response.Redirect を実行する
・おい、サーバ。どこそこのページに行けだってよ
・はいよ、どこそこ。お前が呼び出されたぞ
・お、では行かなくては!!
という順番で「どこそこ」君が呼び出されます。実行して直接ジャンプするものもありますが、こちらを使うことにしましょう。
(書くことが余りないので、ついついページとサーバに成りすましてしまいました...。)

いずれにしても、Response.Redirect() を Click イベントの末尾に書けばいいだけです。

ソース全貌

ここではステップアップC# へのジャンプ回数を計測するようにしてみました。テキストを変えれば、すぐダウンロードカウンタになります。
<%@ Page Language="C#" %>
<%@ import Namespace="System.IO" %>
<%@ import Namespace="System.Text" %>
<script runat="server">
    void LinkButton1_Click(object sender, EventArgs e) {
        string count = "";
        count = Label1.Text;
        StreamWriter sw = new StreamWriter(Server.MapPath(".") + "\\dlcount.txt",false,Encoding.UTF8);
        sw.Write(int.Parse(count) + 1);
        sw.Close();
        Label1.Text = (int.Parse(count) + 1).ToString();
    
        Response.Redirect("http://arc360.info/");
    }
    
    void Page_Load(object sender, EventArgs e) {
        StreamReader sr = new StreamReader(Server.MapPath(".") + "\\dlcount.txt");
        Label1.Text = sr.ReadToEnd();
        sr.Close();
    }
</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <p>
            <asp:LinkButton id="LinkButton1" onclick="LinkButton1_Click" runat="server">ステップアップC#</asp:LinkButton>
        </p>
        <p>
            これまで <asp:Label id="Label1" runat="server"></asp:Label>&nbsp;名の方が ステップアップC# へジャンプしています。 
        </p>
    </form>
</body>
</html>