Viewデザイン
ロジック部分が完成したら、コントローラへモデルに記述したロジックを呼び出すコードを記入します。Index関数が2つあるのは、パラメタなしが対応するViewを呼び出したときに実行される関数と、HttpPost属性がついたパラメタありが対応するViewからSubmitされたときに実行される関数の2種類を用意する必要があるためです。
Public Class HomeController Inherits System.Web.Mvc.Controller Public Property SendMailService As New SendMailService Function Index() As ActionResult ViewData("Message") = "ASP.NET MVC へようこそ" Return View() End Function <HttpPost()> _ Function Index(ByVal model As SendMailModel) As ActionResult If ModelState.IsValid Then Dim result As String = "" If SendMailService.SendMail(model.SmtpServer, model.SmtpPort, model.UserID, model.Password, model.MailAddress, model.ToAddress, model.Subject, model.Body, result) Then Return RedirectToAction("Thanks", "Home") Else ModelState.AddModelError("", result) End If End If Return View(model) End Function Function Thanks() As ActionResult Return View() End Function End Class
- Index関数では画面入力をパラメタとして引き取ります。パラメタの形式は、対応するモデルになります。
- ModelStateのIsValidプロパティがFalseならば「入力値に違反がある」ということなので、すぐにReturn View(model)に制御が移ります。
- SendMailService.SendMailメソッドがTrue(メール送信成功)であれば、/Home/Thanks/ページに遷移します。
ビューの作成
[Views]-[Home]フォルダにあるIndex.vbhtmlファイルを開いて、SendMailModelクラスで定義された項目をHTMLの中に埋め込んでいきます。
@ModelType CZ1106Mvc3.SendMailModel @Code ViewData("Title") = "ホーム ページ" End Code <h2>@ViewData("Message")</h2> @Using Html.BeginForm() @Html.ValidationSummary(True, "メール送信に失敗しました。エラーを修正し、再試行してください。") @<div> <fieldset> <legend>メール送信</legend> <div class="editor-label"> @Html.LabelFor(Function(m) m.SmtpServer) </div> <div class="editor-field"> @Html.TextBoxFor(Function(m) m.SmtpServer) @Html.ValidationMessageFor(Function(m) m.SmtpServer) </div> : (中略) : <p> <input type="submit" value="送信" /> </p> </fieldset> </div> End Using
今回のViewはビューエンジンに「ASPX」ではなく「Razor」を採用しているため、HTMLにかなり近い記法になっています。
Razorらしい記述の1つとして、HTMLヘルパーによるレンダリングがあります。@Html.LabelFor、@Html.TextBoxFor、@Html.ValidationMessageForはすべて「Function(m) m.SmtpServer」というラムダ式をパラメタとして指定していますが、この3つのレンダリング結果はそれぞれ異なります。
- @Html.LabelFor:LabelForはSmtpServerプロパティのDisplay属性の設定値を表示するHTMLヘルパーなのでレンダリング結果はDisplay属性に指定されている「SMTPサーバ」になります。
- @Html.TextBoxFor:TextBoxForはSmtpServerプロパティの値をINPUTタブとして表示入力するHTMLヘルパーになります。
- @Html.ValidationMessageFor:ValidationMessageForはSmtpServerプロパティのRequired属性などのValidation関連の設定値を該当するValidationが発生したときに表示するためのHTMLヘルパーになります。