さて次は更新系。
注意が必要なのは、入力フォームを取得すする際はGET、値を送るのはPOSTであること。
Formでずーっとやってるとその辺を忘れがちになるのですな。
とりあえず、入力フォームを作る。
1: <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
2:
3: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4: <html xmlns="http://www.w3.org/1999/xhtml">
5: <head runat="server">
6: <title>YourName</title>
7: </head>
8: <body>
9: <% using (Html.BeginForm()) { %> 10: <p>Your Name: <%= Html.TextBox("Name")%></p> 11: <input type="submit" value="submit" />
12: <% } %>
13: </body>
14: </html>
とりあえず確認したいので、Actionを定義。
1: public ViewResult YourName()
2: { 3: return View();
4: }
一応、画面を。
HTMLソースを見てみる。
1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2: <html xmlns="http://www.w3.org/1999/xhtml">
3: <head><title>YourName</title></head>
4: <body>
5: <form action="/Home/YourName" method="post">
6: <p>Your Name: <input id="Name" name="Name" type="text" value="" /></p>
7: <input type="submit" value="submit" />
8: </form>
9: </body>
10: </html>
Html.BeginFormが何をやってくれるかは一目瞭然。
ただ、現状のままだとPOSTしても変化なし。
それで、Actionメソッドを修正。
1: [AcceptVerbs(HttpVerbs.Get)]
2: public ViewResult YourName()
3: { 4: return View();
5: }
6: [AcceptVerbs(HttpVerbs.Post)]
7: public ViewResult YourName(string Name)
8: { 9: ViewData["YourName"] = Name;
10: return View();
11: }
上は初期表示のGET時に呼び出される。下はポストされたPOST時に呼び出される。
で、デバッガで確認してみる。画面は、Visual Studio 2010 Beta 1 日本語版(ニヤリ
とりあえず、値が送りつけられていることは確認できた。
通常は入力が正常に完了したら別のページへリダイレクトするので、こんな感じにActionを修正する。
1: [AcceptVerbs(HttpVerbs.Post)]
2: public ViewResult YourName(string Name)
3: { 4: return View("OK"); 5: }
とりあえず、OKというViewを追加する。
1: <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
2:
3: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4:
5: <html xmlns="http://www.w3.org/1999/xhtml" >
6: <head runat="server">
7: <title>OK</title>
8: </head>
9: <body>
10: </body>
11: </html>
ここから(やっと)MVC。
Modelを追加。Accountクラス。プロパティはNameのみ。
1: public class Account
2: { 3: public string Name { get; set; } 4: }
んで、さっきのOK ViewをAccountに関連付ける(Strongly Typed View)。
1: <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Account>" %>
2:
3: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4:
5: <html xmlns="http://www.w3.org/1999/xhtml" >
6: <head runat="server">
7: <title>OK</title>
8: </head>
9: <body>
10: Hello <%= Model.Name %>
11: </body>
12: </html>
Actionメソッドをまたまた変更。
1: [AcceptVerbs(HttpVerbs.Post)]
2: public ViewResult YourName(string Name)
3: { 4: return View("OK", new Account() { Name = Name }); 5: }
それでは、実行。
で、ここで終わりません。もう一か所Actionを修正。
1: [AcceptVerbs(HttpVerbs.Post)]
2: public ViewResult YourName(Account account)
3: { 4: return View("OK", account); 5: }
これで、引数が増減しても影響を受けなくなりました。
ポストされたデータをASP.NET MVCが勝手にModelにバインドしてくれるという不思議。
まだまだ続く。