青島のしま〜Blue Islands〜


ASP.NET Tips

カスタムエラーページの設定

実際にサービスを公開するときに,ASP.NETのエラーページは,赤い色とエラーの文字で悪印象に思えてしまうので,穏やかなエラーページに変えておいたほうがよいです.
IISの設定→www→プロパティ
 →ASP.NETタブ→グローバル構成の編集→カスタムエラー→追加
という手順で,ASP.NETのカスタムエラーページを指定する
・403,404,503ぐらいは変えておいたほうがよさそう
 ※存在しないファイル(.aspx)にアクセスがあると,通常の.htmlにアクセスしたときとは別のエラーページが表示される.つまり,IISのカスタムエラーと,ASP.NETのカスタムエラーは別になっている.
・カスタムエラーの対象をRemoteOnlyにしておけば,localhostからはデバッグ用にエラーが見えるようにできます.

ページをキャッシュするようにする

ASP.NETでは,サーバ側,クライアント側の両方にキャッシュを持たせることができます.
・サーバ側に持たせることで,毎回ページの生成処理を行わなくてすむようになる.(Location="Server")
・クライアント側に持たせることで,画像を毎回ダウンロードしなくなる (Location="Client")
・Location="Any"を指定すると,サーバ,クライアント,中継プロキシの全てでキャッシュを行うようになる
・逆に,キャッシュしないようにするには,Location="None"
<%@ OutputCache Duration="20" Location="Any" VaryByParam="*"%>
参考: http://support.microsoft.com/kb/308516/ja

外部ファイルをインクルードする

Response.WriteFile()を使うと,そのままHTMLファイルを部分的にインクルードして使うことができます.
<%@ Page Language="cs" AutoEventWireup="false"%>
<html>
<body>
    <%
        Response.WriteFile ("hoge.txt");
    %>
</body>
</html>

App_CodeフォルダにC#とVBを混在して使う

普通に,App_CodeフォルダにC#とVBのクラスを混ぜて置くとエラーが出てしまう.
それを避けるためには,フォルダを分け,以下のような記述をWeb.configに追加すればよい.
<compilation>
    <codeSubDirectories>
        <add directoryName="VB" />
        <add directoryName="CShap" />
    </codeSubDirectories>
</compilation>
ただし,App_Codeが一番先にコンパイルされ,C#とVBどちらが先にコンパイルされるかは指定できない?ようなので,App_CodeのC#のクラスからApp_CodeのVBのクラスを使うことはできない?らしい.もちろん,aspxなどからは参照することができる.

GridViewのデータが更新されない

GridViewとDataSourceのプロパティでEnableViewStateをfalseにする必要があります.
デフォルトでtrueになってるので,更新されても,前回のものを使ってしまいます.
DataBindを呼んでも更新されないので,EnableViewStateをtrueにする必要があります.

CSVで表示(Repeaterコントロールを使う)

    <form id="form1" runat="server">
    <div>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:dbHogeConnectionString %>"
            SelectCommand="SELECT * FROM [tbHoge]"></asp:SqlDataSource>

        <h1>CSVで表示</h1>

        <asp:Repeater ID="Repeater1" runat="server" DataMember="DefaultView" DataSourceID="SqlDataSource1">
            <HeaderTemplate>
                id,名前,年齢<br/>
            </HeaderTemplate>
            <ItemTemplate>
                <asp:Label ID="id1" runat="server" Text='<%# Eval("id") %>'></asp:Label>,
                <asp:Label ID="name1" runat="server" Text='<%# Eval("name") %>'></asp:Label>,
                <asp:Label ID="age1" runat="server" Text='<%# Eval("age") %>'></asp:Label>,
            </ItemTemplate>
            <FooterTemplate>
            </FooterTemplate>
        </asp:Repeater>

        <br />
        <br />

        <h1>テーブルで表示</h1>

        <asp:Repeater ID="Repeater2" runat="server" DataMember="DefaultView" DataSourceID="SqlDataSource1">
            <HeaderTemplate>
                <Table border="1">
                    <tr>
                        <td>id</td>
                        <td>名前</td>
                        <td>年齢</td>
                    </tr>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td>
                        <asp:Label ID="id2" runat="server" Text='<%# Eval("id") %>'></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="name2" runat="server" Text='<%# Eval("name") %>'></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="age2" runat="server" Text='<%# Eval("age") %>'></asp:Label>
                    </td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </Table>
            </FooterTemplate>
        </asp:Repeater>
        <br />
        <br />
    </div>
    </form>

DataSourceを使う

AccessDataSourceやSqlDataSourceを,GridViewなどに貼り付けることで,簡単にDBの内容を表すテーブルを表示できます.

GridViewで編集・削除をする

単一のテーブルでないとエラーになるので注意が必要です.
つまり,inner joinなどを使った表示の場合,エラーが出ます.
ただ,単一のテーブルでもエラーになることがありますが,そのあたりは,まだ詳しく知りません..

相対パスでmdbファイル(access)やmdf,ldf(SQL Server)ファイルを指定する

まず,データベースファイルを,WebSitesの下のApp_Dataフォルダ以下に置きます.
そして,データ接続文字列(ConnectionString)のData Source指定に,
Data Source=|DataDirectory|\\hogeDB.mdb
というように書きます.

Webページ内の一部をプログラムで出力したい

aspx.cs内のResponse.Writeを使わずに,
aspxファイル側のディレクティブから,部分的に文字列を出力することができます.

<!-- test.aspx  -->
<html>
<body>
<form runat="server" id="form1">
あなたは,<% = GetName() %> です.
</form>
</body>
</html>

// test.aspx.cs
protected String GetName() {
    return "ほげ";
}

ASXの出力

Response.ContentTypeに"video/x-ms-asf"を指定することで,HTMLではなく,ASXとして出力することができます.
void WriteAsxOpen(strTitle)
{
    // メディアプレーヤーがUTF8を認識してくれないのでSJISにする
    Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift_jis");
    // コンテンツタイプの指定
    Response.ContentType = "video/x-ms-asf";

    Response.Write(
        "<ASX version = \"3.0\">\r\n" +
        "<Title>" + strTitle + "</Title>\r\n" +
        "<Entry>\r\n" + 
        "<Ref href=\"" + strUrl + "\" />\r\n" +
        "</Entry>\r\n");
}

DataSourceを使う

AccessDataSourceやSqlDataSourceを,GridViewなどに貼り付けることで,簡単にDBの内容を表すテーブルを表示できます.

GridViewで編集・削除をする

単一のテーブルでないとエラーになるので注意が必要です.
つまり,inner joinなどを使った表示の場合,エラーが出ます.
ただ,単一のテーブルでもエラーになることがありますが,そのあたりは,まだ詳しく知りません..

相対パスでmdbファイル(access)やmdf,ldf(SQL Server)ファイルを指定する

まず,データベースファイルを,WebSitesの下のApp_Dataフォルダ以下に置きます.
そして,データ接続文字列(ConnectionString)のData Source指定に,
Data Source=|DataDirectory|\\hogeDB.mdb
というように書きます.

IISで,ASP.NET2.0を使えるようにする

以下のエラーが出て困ったら
解析エラー メッセージ: 構成セクション connectionStrings を認識できません。

  • 「規定のWebサイト」のプロパティから,「ASP.NET」タブ⇒「ASP.NETバージョン」を1.1から2.0に変更する
  • さらに,「C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i -enable」を実行
つまり,Visual Studio 2005だとデフォルトで2.0用に出力されるので,IISで.NET framework2.0が有効になってないといけないわけですね.

ASP.NETで作成したWebサイトを公開する

Webサイトを配置するためには,
  • 「ビルド」⇒「Webサイトの発行」で直接パスを指定して配置する
  • さらに,IISで公開できるようにするためには,IISの管理画面で,配置したフォルダのプロパティを開き,「ディレクトリ」タブの「アプリケーションの設定」にある「作成」ボタンをクリック.
    • そうすると,アイコンが変わる.これをやらないと以下のような意味不明なエラーがでて困ることになる..
構成にエラーがあります。 
説明: この要求を処理するために必要な構成ファイルの処理中にエラーが発生しました。
以下のエラーの詳細を確認し、構成ファイルに変更を加えてください。 

パーサー エラー メッセージ: アプリケーション レベルを超えて
allowDefinition='MachineToApplication' として登録されている
セクションを使うことはできません。
このエラーは、仮想ディレクトリが IIS でアプリケーションとして
構成されなかった場合に発生します。

ソース エラー: 
行 52: 		<authentication mode="Windows"/>

POSTされたデータの扱い方

Requestオブジェクトに入っています.
// <input type="text" name="text1">というテキストボックスがあったとする
Label1.text = Request["text1"];
というようにすれば使えます.


作成日: 2006年12月20日09時31日08秒
更新履歴
2008年07月22日 2008年02月08日 2008年02月06日 2008年02月05日 2007年10月25日 2006年12月20日 2006年12月19日 2006年12月05日 2006年09月20日 2006年06月18日 2006年06月12日 2006年04月22日 2006年03月30日 2006年02月28日 2006年02月23日 2006年02月18日 2006年01月13日 2005年12月21日