3


1

私はこれでも "Webフォーム"になっているように感じますが、とにかくお願いします。 私はいくつかの入力フィールドとその上に2つのボタンを持つASP.NET MVCプロジェクトのフォームを持っています。 1つのボタンは、リストボックスの1つを「フィルタリング」するために使用されます。 もう一方はフォームの送信に使用されます。 私の見解は次のようになります。

<%using(Html.BeginForm()){%> <%= Html.TextBox( "SearchItems")%> <%= Html.ListBox( "SelectedItems"、新しいMultiSelectList(model.AvailableItems、 "Id"、 "Name "、model.SelectedItems))%> //その他のフォームフィールド。 <%}%>

私の行動は次のようになります。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index([バインド(プレフィックス= "")] SendMessageRequestモデル){if(model.Command == "検索")return SearchItems(model); if(model.Command == "Send")はSend(model)を返します。新しい例外をスローします( "コマンドが無効です。")。 }

これにより、コントローラはクリックされたボタンに基づいて正しい動作を選択します。 ただし、入力ボタンの値も表示されているテキストであるため、理想的ではありません。 このアプリを翻訳したいのであれば、アクションは中断します。 これを回避するために、私は要素を使用することができます、それはテキストと値が異なることを可能にします。 ただし、このアプリはPocket IE用で、どうやらPocket IEはこれらを異なる方法で処理します。 - Commandに_both_値を送信すると、アクションが中断されます。

これはPocket IE用なので、私はJavaScriptでできることについてもかなり制限があります。 Ajaxは出ましたが、ボタンのonClickから隠しフィールドを設定できる可能性があります。

それで、私の質問は、MVCビューに複数のボタンを持つ単一のフォームを可能にするための最良の方法は何ですか? あるいは、私の考えをどうにかして複数の形式に分割するべきでしょうか。

4 Answer


5


私は2つの異なる行動を持つ複数のフォームを提案するでしょう。 これはもっとテストしやすいと思います。

(c ⇒ c.Search()、FormMethod.Get); \ {%>検索(c ⇒ c.Send()、FormMethod.Post); \ {%>送信

それとも何か。 その後、コントローラでは2つの対応するアクションがあります。 これは責任が解消されたことを意味します。 MVCでは、Webフォームとは異なり、複数のフォームを持つことができます。 だからあなたは自由に破ることができます!


1


隠しフィールドは必要ありません。ボタンのクリックイベントでフォームのアクションを設定できます。

(jQueryの)JavaScriptは次のようなものです。

$( "#myForm")。attr( "action"、 "mvcaction"); $( "#myForm")。submit();

たとえば、アクションであるパラメータを受け取る標準​​関数でそれをまとめることができます。 これをメニューフォームオブジェクトの標準メニュー項目に使用しています。これは非常にうまく機能します。

編集:Pocket PCがJQueryをまったく処理しないかどうかは定かではありませんが、そうでない場合は、通常のJavaScriptで上記を実行することが可能なはずです。


1


これが複数のボタンフォームのためのすべての選択肢を説明しているとても良い記事です:http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same- form.aspx

個人的にはOddに同意します。jQueryのクリックアクションが最善の選択肢のようです。


0


私が作成しているアプリは大規模にajaxされている必要がありますが、複数フォームの問題も同様に発生します。

jQueryライブラリの$ .post()メソッドを使用してそれをやり取りしました。

$( "#update")。(function(){$ .post( "/ Register"、{name:$( "#firstName")。val()、surname:$( "#surname")。val()をクリックします。 )、ユーザー名:$( "#email")。val()、アカウント名:$( "#accountName")。val()、パスワード:$( "#password")。val()}、関数(データ){ alert(data);});});

そしてキャンセルボタンはより少ない値を送り返しました。

$( "#cancel")。(function(){$ .post( "/ Cancel"、{username:$( "#email")。val()、password:$( "#password")。val() )(function(data){alert(data);});});

それはまた有効にされているjavascriptに依存しています、しかしもしあなたがjavascriptを無効にしようとしているなら、あなたはインターネットを使うのが最善ではありません