ASP.NET MVC のモデル追加/編集用のビューの実装について。
ネット上で見つけたサンプルや、Visual Studio の Scaffolding サポートによって生成された例をみると、いずれも "Save" とか "OK" とかの input type=submit なボタンはあるが、"Cancel" "キャンセル" ボタンは無かった。
まぁ、サイトマップパス(パンくずリスト)からたどってもいいし、ブラウザの戻るボタンでもかまわないので、"Cancel" ボタンは必須ではないのはうなずける。
ただ、個人的には、"OK" ボタンがあるなら、対になる "Cancel" ボタンも必ず用意しておきたいところ。
たとえ他の代替手段があるにしても、だ。
ではどのように実装すればよいのか?
ボタンに応じてPOST先のURLを変える(つまり、呼び出すアクションを、"OK" ボタンと "Cancel" ボタンで違える)、というのもひとつの手段だろう。
"Cancel” ボタンの click イベントを拾って、動的に form 要素の action 属性を書き換えてもいいだろう。
あるいはまた、action 属性に Cancel アクションへの URL を指定済みの form 要素をあらかじめもうひとつ追加して、"Cancel" ボタンはそちらの form に収録してもいいだろう。
(ASP.MVC 標準のビューは、その仕組み上、form 要素はビュー内にいくつあろうともかまわない。いわゆるフツーの HTML だ。)
でもなんだかごちゃごちゃしている。
たかだかこれだけの目的で、ビューを記述するキータイプ量が増えすぎている気がする。
と考えてはたと気がついた。
何のことはない、同じ name 属性値で "OK" と "Cancel" ボタンを設けておき、アクションの引数でこれを受け取って判定すればよいのだ。
ビューに次のように記述し、
<input type=submit name="OKorCancel" Value="OK"/>
<input type=submit name="OKorCancel" Value="キャンセル"/>
アクションでは次のように判定すればよい。
public ActionResult Edit(int id, string OKorCancel) {
if (OKorCancel == "OK") { // "OK"ボタンが押された!
たかだかこの程度のことだった。
HTML、HTTP の原点を忘れていた。
初心忘れるべからずだ。
#ネット上で吐露するには恥ずかしい投稿内容である気がしてならないが、ASP.NET MVC 1.0 がついに正式リリースされたということで、ネタとしてはまぁ悪くないでしょう。