コンベンションは、あまりにも多くのフープを飛び越えることなく、すでに利用可能です。秘訣は、ビューに渡すモデルに基づいて TextBox 値を接続することです。
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult CreatePost()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreatePost(FormCollection formCollection)
{
try
{
// do your logic here
// maybe u want to stop and return the form
return View(formCollection);
}
catch
{
// this will pass the collection back to the ViewEngine
return View(formCollection);
}
}
次に発生するのは、ViewEngine が formCollection を受け取り、Html ヘルパーを使用して、コレクション内のキーをビュー内の ID 名/値と照合することです。例えば:
<div id="content">
<% using (Html.BeginForm()) { %>
Enter the Post Title: <%= Html.TextBox("Title", Model["Title"], 50) %><br />
Enter the Post Body: <%= Html.TextArea("Body", Model["Body"]) %><br />
<%= Html.SubmitButton() %>
<% } %>
</div>
textbox と textarea の ID が Title と Body であることに注意してください。ここで、View の Model オブジェクトから値を設定する方法に注目してください。FormCollection を渡したので (そして FormCollection で厳密に型指定されるようにビューを設定する必要があります)、アクセスできるようになりました。または、厳密に入力せずに、単に ViewData["Title"] を使用できます (私は思います)。
POOFあなたの魔法の ViewState。この概念は、設定より規約と呼ばれます。
上記のコードは、FormCollection を使用した最も単純で生の形式です。FormCollection の代わりに ViewModel を使い始めると、興味深いことが起こります。モデル/ビューモデルの独自の検証の追加を開始し、コントローラーにカスタム検証エラーを自動的にバブルさせることができます。しかし、それは別の日の答えです。
Post オブジェクトの代わりに PostFormViewModel を使用することをお勧めします。いずれにせよ、アクション メソッドでオブジェクトを要求することにより、呼び出し可能な IsValid() メソッドを取得できます。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreatePost(Post post)
{
// errors should already be in the collection here
if (false == ModelState.IsValid())
return View(post);
try
{
// do your logic here
// maybe u want to stop and return the form
return View(post);
}
catch
{
// this will pass the collection back to the ViewEngine
return View(post);
}
}
また、厳密に型指定されたビューを微調整する必要があります。
<div id="content">
<% using (Html.BeginForm()) { %>
Enter the Post Title: <%= Html.TextBox("Title", Model.Title, 50) %><br />
Enter the Post Body: <%= Html.TextArea("Body", Model.Body) %><br />
<%= Html.SubmitButton() %>
<% } %>
</div>
さらに一歩進んで、コントローラーで設定した ModelState から直接、ビューにエラーを表示することもできます。
<div id="content">
<%= Html.ValidationSummary() %>
<% using (Html.BeginForm()) { %>
Enter the Post Title:
<%= Html.TextBox("Title", Model.Title, 50) %>
<%= Html.ValidationMessage("Title") %><br />
Enter the Post Body:
<%= Html.TextArea("Body", Model.Body) %>
<%= Html.ValidationMessage("Body") %><br />
<%= Html.SubmitButton() %>
<% } %>
</div>
このアプローチの興味深い点は、ビューで検証の概要や個々の検証メッセージを設定していないことに気付くことです。私は DDD の概念を実践するのが好きです。つまり、私の検証メッセージ (および要約) は私のドメインで制御され、コレクションの形で渡されます。次に、コレクションをループして (エラーが存在する場合)、それらを現在の ModelState.AddErrors コレクションに追加します。あとはView(post)を返すと自動です。
たくさんのコンベンションが出ています。これらのパターンをより詳細にカバーする、私が強くお勧めする数冊の本は次のとおりです。
この順序で、最初の部分は MVC フレームワーク全体の生の基本事項をカバーしています。後者は、Microsoft の公式レルム以外の高度なテクニックをカバーしており、作業をより簡単にするいくつかの外部ツール (Castle Windsor、Moq など) を使用しています。