コマンドラインとエディターのみでWeb開発する方法を説明。今回は一般ユーザーがtestデータベースをCRUD処理するためのページを実装していく。
powered by Insider.NET
本連載では、部門コンピューティング(Excel+VBAで簡単な業務アプリを開発するようなこと)レベルの開発手法として、ASP.NETを利用した軽量Webアプリ開発を説明する。タブレットを利用した業務アプリのプロトタイプ実装や、Excel+VBAの業務アプリのWebアプリへの移行などの参考にしていただきたい。
なお本連載では、最小限のセットアップでWindowsを活用できるよう、可能な限りGUIツールを利用することなくコマンドラインとエディターのみで開発する方法を説明している。また、本連載では個別のファイルの拡張子には小文字の「.aspx」を利用するが、ASP.NETの埋め込みHTMLファイルを示す場合は「ASPX」(ASPXファイル)と大文字で記述する。
今回は、第2回で作成したtestテーブルのCRUD処理に相当するページを作成する。
再掲になるが、各ページの関係は下図のようになる*1。
*1 サンプルではdeleteをプログラム構成の都合から更新ページで実行している。
以下、順に各ページに対応するASPXファイルについてソースコードと実装時の注意点を説明する。
インデックスページでは、テーブルの各行を列挙する。各行には内容を表示するためのリンクを持つ。また、新規作成用のボタンを配置する(以下の画面)。
<%@ Page Language="C#" EnableViewState="false" Debug="true"%>
<%@ Import namespace="System.Data.SqlClient"%>
<%@ Import namespace="System.Web" %>
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<section>
<form action="create.aspx" method="get">
<input type="submit" value="新規作成">
</form>
</section>
<section>
<table>
<tr><th>更新日</th><th>件名</th><th>内容</th><th>作成日</th></tr>
<%
using (var conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|testdb.mdf;User Instance=true"))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from test order by update_date desc"; ← (1)
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var subject = reader["subject"] as string;
if (string.IsNullOrEmpty(subject)) subject = "no subject"; ← (2)
var content = reader["content"] as string;
if (content.Length > 20) content = content.Substring(0, 20) + '…'; ← (3)
%>
<tr><td><%= ((DateTime)reader["update_date"]).ToString("g")%></td>
<td><a href="read.aspx?id=<%= reader["id"]%>"><%= HttpUtility.HtmlEncode(subject)%></a></td> ← (4)
<td><%= HttpUtility.HtmlEncode(content)%></td>
<td><%= ((DateTime)reader["create_date"]).ToString("d")%></td>
</tr>
<%
}
}
}
conn.Close();
}
%>
</table>
</section>
</html>
通常、インデックスページはURIでディレクトリのみを指定した状態でも表示されることが望ましい。この場合であれば、ブラウザーで「http://ホスト名/test/」まで入力して[Enter]キーを押したら、自動的にindex.aspxファイルが実行されることである。
ディレクトリ名が指定された場合のIISの振る舞いはdefaultDocumentパラメーターで決定される。
以下のようにappcmdを実行することで、testのdefaultDocumentパラメーターにindex.aspxファイルを設定できる(管理者権限が必要)。
> cd \windows\system32\inetsrv
> .\appcmd set config "Default Web Site/test" /section:defaultDocument /enabled:true "/+files.[value='index.aspx']"
構成変更を構成コミット パス "MACHINE/WEBROOT/APPHOST/Default Web Site/test" の "MACHINE/WEBROOT/APPHOST/Default Web Site/test" のセクション "system.webServer/defaultDocument" に適用しました
PowerShellから実行する場合、最後の「/+files」パラメーターを「""」で囲まないと、PowerShellが[]をコレクションのインデクサーとして扱うためエラーとなる点に注意が必要である。
今回は実装していないが、通常、全てのレコードが1ページに収まらない場合には*2、1ページ当たりに表示する行数によってテーブルを分割して仮想的なページ番号へ割り当てる。例えば1〜20行目をページ1、21〜40行目をページ2とし、各ページへのリンクと指定された位置を表示する機能(ページング)を実装する。参考までにSQL Serverでページングを実現するためのSQLコードを以下に示す。
*2 ただし、タブレットなどを対象とした場合、数百行程度であればページを指定させて表示するよりもスクロールさせる方が読みやすいこともあるので、結局はケースバイケースだ。
SQL Serverにはページングのための特別なSQL構文は用意されていない。そのため以下のようにselect結果の1からの行番号を返すrow_number関数を利用してページングを実装する。ここでは@rowsをページ当たりの行数、@pageを1からのページ番号を設定した変数としている。
with paged_test as
(select * ,
row_number() over (order by update_date) as row ← (1)
from test
)
select (select max(row) from paged_test) as total_rows, ← (2)
* from paged_test
where paged_test.row between @rows*(@page-1)+1 and @rows*@page
Copyright© Digital Advantage Corp. All Rights Reserved.