|
ニュース検索
ピックアップ
今週のIT求人情報
|
ASP.NET で作成する評価フォームはじめに私にはJakeという息子が生まれたばかりで、早く写真を見せろという要求が親類縁者から引きも切らず寄せられてきます。Web開発者の端くれとして、当然、赤ん坊のためのWebサイトを作り、写真をすべてそこに載せることを考えました。さらに、Jakeの崇拝者がそれぞれ好きな写真に投票し、毎月末、見事1位に輝いた写真の光り輝くプリントが各自の郵便受けに送り届けられるというアイデアはどうでしょうか。この計画を実行に移すには、写真1枚1枚の評価を継続的に受け付けることが必要で、サイト上でそれをやってくれるユーティリティを開発しなければなりません。まず、そのユーティリティにどのような機能が必要かを考えました。 計画どのようなプログラミングに取りかかるときも、私はまず問題を把握し、解決手順の概要を思い描くことに多少の時間を費やします。このユーティリティに望まれる機能は何でしょうか。次のように書き出してみました。
設計次に写真評価フォームを設計しました。図1のフォームがそれです。このフォームの背後にあるコードは次のとおりです。 図1 ![]() <form runat="server"> <asp:Linkbutton text="Rate this muggle photo" id="Rate_This_Photo_Button" OnClick="Show_Rate_Article" runat="server" /> <div id="Rate_Form" runat="server" visible="false"> <table width="178" align="center" cellpadding="5" cellspacing="5"> <tr> <td valign="top"> <table> <tr> <td valign="top">Rating:<br></td> <td> <asp:RadioButtonList cellpadding="0" cellspacing="0" id="MyRadioButtonList" runat="server"> <asp:ListItem value="1">*</asp:ListItem> <asp:ListItem value="2">* *</asp:ListItem> <asp:ListItem value="3">* * *</asp:ListItem> <asp:ListItem value="4">* * * *</asp:ListItem> <asp:ListItem value="5">* * * * *</asp:ListItem> </asp:RadioButtonList> <asp:RequiredFieldValidator id="Reqd_Radios" ControlToValidate="MyRadioButtonList" ErrorMessage="Please rate the muggle." Runat="server" /> </td> </tr> </table> Comments:<br> <asp:Textbox TextMode="multiline" rows="5" cols="15" runat="server" id="Comments" /><br> <asp:Linkbutton text="Submit" OnClick="Submit_Rating" runat="server" /> </td> </tr> </table> </div> </form> このフォームは、 さて、フォームに入力されたすべての値をデータベースに挿入しなければなりません。それには、 Sub Submit_Rating(sender As Object, e As EventArgs) Dim myConnection As New SqlConnection _ (ConfigurationSettings.AppSettings("MyDSN")) ’The SqlCommand receives two parameters. ’The first is the name of my stored procedure. ’And the second is the name of my database connection from above. Dim myCommand As New SqlCommand _ ("sp_Muggle_PhotoRatingInsert", myConnection) myCommand.CommandType = CommandType.StoredProcedure 次に、ストアドプロシージャへの入力パラメータを追加しなければなりません。これには、 Dim parameterPhoto_ID As New SqlParameter _ ("@Photo_ID", SqlDbType.Int, 4) ’Here Photo_ID is a public variable set by the calling page parameterPhoto_ID.Value = Photo_ID myCommand.Parameters.Add(parameterPhoto_ID) Dim parameterRating As New SqlParameter _ ("@Rating", SqlDbType.Float, 8) parameterRating.Value = MyRadioButtonList.SelectedItem.Value myCommand.Parameters.Add(parameterRating) ストアドプロシージャに与えるその他のパラメータについては、特に複雑なことはありません。 Dim parameterComments As New SqlParameter _ ("@Comments", SqlDbType.VarChar, 255) parameterComments.Value _ = Comments.Text ’The contents of the multiline textbox myCommand.Parameters.Add(parameterComments) Dim parameterRemote_Address As New SqlParameter _ ("@Remote_Address", SqlDbType.VarChar, 50) parameterRemote_Address.Value _ = Request.Servervariables("REMOTE_HOST") myCommand.Parameters.Add(parameterRemote_Address) パラメータが追加できました。このストアドプロシージャを実行するには、データベース接続を開き、 myConnection.Open() ’I use the ExecuteNonQuery method because the stored procedure does ’not return any rows from the database. myCommand.ExecuteNonQuery() ’Close the database connection myConnection.Close() End Sub さて、これまでに何が達成されたでしょうか。フォームができました。ユーザーはこのフォームで個々の写真を評価(1〜5)し、何か思うところがあれば、それをフィードバックできます。しかし、評価結果の表示方法にはまだ手をつけていません。せっかくですから、写真の最新評価をグラフィカルに表示することにしましょう。 各写真の最新評価を正確に反映した画像を動的に作成するには、どうすればいいでしょうか。幸いなことに、ASP.NETでは画像をその場で作成できます。詳しい方法については、『Drawing Serpinski’s Triangle with ASP.NET』や、『Create Snazzy Web Charts and Graphics On the Fly with the .NET Framework』といった記事を参照してください。次の節では、ユーザーの投票後すぐに、その写真の最新評価を動的に作成する方法を考えます。 画像 画像の表示には、 表示する画像を指定するために、サーバ側 <!-- create a server-side image tag --> <img id="RatingBar" runat="server" /> ’In the server-side code, you can set the src property like so: RatingBar.Src = "photo_rating_image.aspx?Photo_ID=" & Photo_ID 上のコードでは、 「photo_rating_image.aspx」ファイルのコードを見てみましょう。まず、このファイルで使用する名前空間をインポートし、サーバ側スクリプトブロックを開いて、
<%@ Import Namespace = "System.Data" %>
<%@ Import Namespace = "System.Data.SqlClient" %>
<%@ Import Namespace = "System.Drawing" %>
<%@ Import Namespace = "System.Drawing.Imaging" %>
<Script runat="server">
Sub Page_Load( Sender As Object, e As EventArgs)
「photo_rating_image.aspx」ファイルは、クエリ文字列経由で ’Start by getting our Photo_ID from the querystring Dim Photo_ID As Integer = Request.Querystring("Photo_ID") 前の節では、ユーザーの投票をデータベーステーブルに書き込むためにデータベース接続を確立しました。今度は全体評価を表示することが目的ですから、それとは別のデータベース接続を確立して、累積的評価を取り出さなければなりません。やり方は以前と同様ですが、今回は ’Set up a connection to my database as well as a ’SqlCommand Object for my stored procedure Dim myConnection As New SqlConnection _ (ConfigurationSettings.AppSettings("MyDSN")) Dim myCommand As New SqlCommand _ ("sp_Muggle_PhotoRatingOutput", myConnection) myCommand.CommandType = CommandType.StoredProcedure ’Add the Photo_ID as a parameter to the stored procedure Dim parameterPhoto_ID As New SqlParameter _ ("@Photo_ID", SqlDbType.Int, 4) parameterPhoto_ID.Value = Photo_ID myCommand.Parameters.Add(parameterPhoto_ID) このストアドプロシージャが前の例と異なる点は、出力パラメータ経由で値を返すことです。 ’Add the Rating as a parameter to the stored procedure ’and specify its direction as output Dim parameterRating As New SqlParameter _ ("@Rating", SqlDbType.Float, 8) parameterRating.Direction = ParameterDirection.Output myCommand.Parameters.Add(parameterRating) 次に示す数行のコードで、 ’Open the connection, execute the stored procedure ’and close the connection myConnection.Open() myCommand.ExecuteNonQuery() myConnection.Close() Dim Rating_Output as Double Rating_Output = parameterRating.Value ’Set up the constants for our image Dim MaxImageLength As integer Dim MaxImageHeight As integer MaxImageHeight = 15 ’ pixels MaxImageLength = 168 ’ pixels 画像の最大長を Dim Rating as Integer Rating = Cint(((Rating_Output) / 5) * MaxImageLength) これで、写真の評価値が得られます。次の節では、評価値のグラフィカル表現をJPEGとして動的に作成する方法を考えてみます。 ASP.NETでの描画 前の節では、個々の写真の評価結果をどう取り出してくるかを見ました。今度は、ASP.NET Webページにおける画像の動的描画の方法を考えます。画像表示には、単一GIFから動的に(おそらくGIFの幅を操作するなどして)生成する方法や、さまざまな評価結果を事前に1組の静的画像として用意しておく方法なども考えられますが、ここでは.NET Frameworkの 画像を動的に描画するには、 Dim objBitmap as Bitmap = new Bitmap(MaxImageLength, MaxImageHeight) 次に、いま作成した Dim objGraphics as Graphics = Graphics.FromImage(objBitmap) 画像は、銀色の背景に緑色で描くことにして、その2色のブラシをセットアップします。ただ、緑色は、カラーパレットにあるものをそのまま使用するのでなく、サイトの色にぴったりマッチする緑色にしたいので、 Dim objBrushGreen as SolidBrush _ = new SolidBrush( Color.FromArgb( 88, 128, 86 )) 銀色には、 Dim objBrushGray as SolidBrush = new SolidBrush(Color.Silver) まず、 objGraphics.FillRectangle _ (objBrushGray, 0, 0, MaxImageLength, MaxImageHeight) 得られた銀色の長方形の中に評価のグラフィック表現を描きます。起点のy位置を objGraphics.FillRectangle _ (objBrushGreen, 0, 2, Rating , MaxImageHeight - 4) 画像の6地点に、2ピクセル幅の銀色の線(縞)を高さいっぱいに描きます。これが評価尺度です。最初と最後の縞は、2ピクセル幅の境界線になります。 objGraphics.FillRectangle(objBrushGray, 0, 0, 2 , MaxImageHeight) objGraphics.FillRectangle(objBrushGray, 32, 0, 2 , MaxImageHeight) objGraphics.FillRectangle(objBrushGray, 65, 0, 2 , MaxImageHeight) objGraphics.FillRectangle(objBrushGray, 99, 0, 2 , MaxImageHeight) objGraphics.FillRectangle(objBrushGray, 132, 0, 2 , MaxImageHeight) objGraphics.FillRectangle(objBrushGray, 166, 0, 2 , MaxImageHeight) これで描画は終わり、あとは画像をブラウザに送るだけです。それには、ページの応答のコンテンツタイプを指定し(JPEG画像を作成するので ’Set the response.contentytpe to image ’and send the image to the browser Response.ContentType = "image/jpeg" objBitmap.Save(Response.Outputstream, ImageFormat.JPEG) objBitmap.Dispose() objGraphics.Dispose() これで、ユーザーに写真を評価してもらうページと、最新の評価結果を画像として動的に生成するページができました。あと必要なものは、写真が表示される各ページに評価画像をはめ込むためのユーザーコントロールです。次の節では、このユーザーコントロールの作り方を考えます。 ユーザーコントロールの作成 写真を表示するページには、「photo_rating.ascx」というユーザーコントロールを配置します。このコントロールは
<%@ Import Namespace = "System.Data" %>
<%@ Import Namespace = "System.Data.SqlClient" %>
<Script runat="server">
’Photo_ID is public so the page that includes
’this user control can set its value
Public Photo_ID As Integer
このコントロールの Sub Page_Load( Sender As Object, e As EventArgs) Get_Rating() End Sub このサブルーチンは、さらに Sub Get_Rating() Try Dim myConnection As New SqlConnection _ (ConfigurationSettings.AppSettings("MyDSN")) Dim myCommand As New SqlCommand _ ("sp_Muggle_PhotoRatingOutput", myConnection) myCommand.CommandType = CommandType.StoredProcedure Dim parameterPhoto_ID As New SqlParameter _ ("@Photo_ID", SqlDbType.Int, 4) parameterPhoto_ID.Value = Photo_ID myCommand.Parameters.Add(parameterPhoto_ID) Dim parameterRating As New SqlParameter _ ("@Rating", SqlDbType.Float, 8) parameterRating.Direction = ParameterDirection.Output myCommand.Parameters.Add(parameterRating) myConnection.Open() myCommand.ExecuteNonQuery() myConnection.Close() Dim Rating as Double Rating = Left(parameterRating.Value, 4) RatingBar.Src _ = "/ssi/photo_rating_image.aspx?Photo_ID=" & Photo_ID MySpan.InnerHtml = Rating.ToString() & " out of 5" MyDiv.Visible = True Catch exc As Exception MyDiv.Visible = False End Try End Sub <div id="MyDiv" align="left" style="margin-left:5px" runat="server" > Average user rating<br> <img id="RatingBar" runat="server" /> <span id="MySpan" runat="server" /> </div> あの醜いフォームがすべてのページで表示されることは避けたいので、 Sub Show_Rate_Article(sender As Object, e As EventArgs) Rate_Form.Visible=True Rate_This_Photo_Button.Visible=False End Sub <asp:Linkbutton text="Rate this muggle photo" id="Rate_This_Photo_Button" OnClick="Show_Rate_Article" runat="server" /> 最後に 将来に向かって改善すべき点は、同じユーザーが同じ写真に何度も投票するのを防ぐことです。現状では、ユーザーが以前見た写真に戻ってきて、再度投票することが可能になっています。防止にはクッキーを利用できるでしょう。 最終的に、計画段階で思い描いたとおりのユーティリティができあがりました。これで、私のサイトを訪れるユーザーは写真を評価し、コメントを残し、個々の写真が現在までにどう評価されているかをグラフィカル表現で見ることができます。最終的なコードと、テーブルおよびストアドプロシージャを作成するためのデータベースコマンドは、ダウンロードサンプルに収録されています。また、http://www.themuggle.com/view.aspでライブデモを参照できます(評価を添えた写真の一例が、http://www.themuggle.com/viewdetails.aspx?ID=437にあります)。 では皆さん、ハッピープログラミング! 著者紹介Paul Apostolos(Paul Apostolos)
関連テーマ
新着ニュース・コラム ホワイトペーパー
|
注目のトピックス 話題の記事
カラオケ「JOYSOUND」に新機種、ギター演奏やコラボ動画でバンド活動ができるように
「ピース」サインはギリシャでは侮辱の仕草―トリップアドバイザー「外国でやってはいけないハンドサイン」
目の疲れや肩こり・腰痛、その原因は PC やスマホが発する“ブルーライト”
NIFTY-Serve の「フォーラム」が1年限定で復活
地図サイト「MapFan」、全キャリアの Android・iPhone に対応
⇒一覧を見る
アクセスランキング
最新コラム一覧
|
||||||||||||||||||||