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ヘルパーになります。
