Asp.Netエンタープライズソリューションパターン その1 MVC

仕事で使いそうなのでASP.NETを詰め込み勉強。
Web系から5年くらいは遠ざかってるし、.NetでもAsp.Netは触ってないので素振りしておくことにした。
で、「.Netによるエンタープライズソリューションパターン」を読む。
最初の方、訳が良くないのか、概念的な話だからなのか読み辛い。
パターンのカタログだと思って3章から読んでもいいのかも。

まずはMVCから。
●モデル
テーブル(DBのビュー)と一対一対応
DLINQならデータクラス?

●ビュー
情報の表示を管理。
xxx.aspxファイル

●コントローラ
ユーザからの入力を解釈して、モデルやビューに変更を通知
ここでは≒ページコントローラ
コードビハインドしたcsファイル。

モデルはビューにもコントローラにも依存しない
ビューはモデルに依存
コントローラはビュー、モデル、双方に依存

サンプルコードで

string selectCmd = string.Format("select.... Where recordingId={0}...",recordingId);

とかやってるのはヤめてほしいな。

ASP.NETでのモデル ビュー コントローラ の実装、を写経しようかと思ったんだけど、さすがに本が古いので少し変える。
モデルクラスではDLINQを使ってみた。
データバインドできるのかなーと、DataSourceに突っ込んでみたらあっさりバインドできた。

mvc.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MVC.aspx.cs" Inherits="MVC" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>MVC</title>
</head>
<body>
    <form id="form" runat="server">
        <h3>楽曲</h3>
        楽曲の選択:<br />
        <asp:DropDownList ID="recordingSelect" runat="server" />
        <asp:Button ID="Button1" runat="server" Text="submit" onclick="Button_Click" />
        <p />
        <asp:DataGrid id="MyDataGrid" runat="server" Width="600" BackColor="#ccccff" BorderColor="black" ShowFooter="false"
        CellPadding="3" CellSpacing="0" Font-Names="Verdana" Font-Size="8pt" HeaderStyle-BackColor="#aaaadd" EnableViewState="false" />        
    </form>
</body>
</html>

mvc.aspx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class MVC : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            return;
        }
        this.recordingSelect.DataSource = DatabaseGateway.GetRecorginds();
        this.recordingSelect.DataTextField = "title";
        this.recordingSelect.DataValueField = "id";
        this.recordingSelect.DataBind();
    }
    protected void Button_Click(object sender, EventArgs e)
    {
        MyDataGrid.DataSource = DatabaseGateway.GetTracs(Convert.ToInt32(recordingSelect.SelectedValue));
        MyDataGrid.DataBind();
    }
}

DatabaseGateway.cs

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;


public class DatabaseGateway
{
    private DatabaseGateway()
    {
    }

    public static IQueryable<recording> GetRecorginds()
    {
        RecordingsDataContext recordings =
           new RecordingsDataContext("Data Source=Gerbera;Initial Catalog=recordings;Persist Security Info=True;User ID=sa;Password=p;Pooling=False");

        return from rec in recordings.recording
               select rec;
    }

    public static IQueryable<trac> GetTracs(int recordingId)
    {
        RecordingsDataContext recordings =
            new RecordingsDataContext("Data Source=Gerbera;Initial Catalog=recordings;Persist Security Info=True;User ID=sa;Password=p;Pooling=False");

        return from trac in recordings.trac
               where trac.recordingId == recordingId
                  select trac;
    }
}