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; } }