3

私の MVC 3 Razor ビューのいくつかを操作すると、フォームをネストする必要があることがわかりましたが、これは不可能です (HTML では許可されていません)。

テーブルを含む、特定のアクションを対象とする 1 つのフォームがあります。しかし、some/all/one_particular tablerow では、別のアクションをターゲットにする必要があります。例えば:

@using (Html.BeginForm("EditPersons"))
{
    <table>
        <tr>
            <th>Name</th>
            <th>Age</th>
        </tr>
        @for (int i=0; i < Model.Persons.Count; i++)
        {
            <tr>
                <td>@Html.TextBox(...)</td>
                <td>@Html.TextBox(...)</td>
            </tr>
        }
            <tr>
                <td></td>
                <td>
                    @using (Html.BeginForm("AddPerson")
                    {
                        <input type="submit" value="Add person" />
                    }
                </td>
            </tr>
    </table>
}

これで、明らかに [Add person] ボタンをテーブル全体の下に配置できますが、それをテーブルの 2 列目に配置するにはどうすればよいでしょうか?

また、「人を追加」ボタンで非表示フィールドに「コマンド」を入力し、EditPersons アクションで、人を追加するか、既存の人の更新データを保存する必要があるかどうかを確認することもできますが、それはやや面倒だと思います。単一目的のアクションのパラダイムを無効にします (恐ろしく古い学校の ASP の「自分自身への投稿」フォームとは対照的に)。

それで、どうすればこれを解決できますか?

4

4 に答える 4

2

こんにちは、2 つのフォームが必要な理由と、サーバー側のテクノロジを使用する必要がある理由がわかりません。

誰かがasp.net mvcテクノロジーを使用して解決策を見つけることができると確信していますが、私に関する限り、javascriptはこれを簡単に行うことができます. したがって、フォーム全体を送信する前にいくつかの値をサーバーに送信できるようにしたい場合や、フォームの一部を全体としてではなく別の方法で動作させたい場合があります。それはいいです。いずれにせよ、javascript はあなたの言語です。(jQuery を使用して) コードに次の変更を加えることを検討してください。

@using (Html.BeginForm("EditPersons"))
{
    <table>
        <tr>
            <th>Name</th>
            <th>Age</th>
        </tr>
        @for (int i=0; i < Model.Persons.Count; i++)
        {
            <tr>
                <td>@Html.TextBox(...)</td>
                <td>@Html.TextBox(...)</td>
            </tr>
        }

        <tr>
            <td><input type="text" id="field" name="field"/></td>
            <td>
                <input type="button" id="btnAddPerson" value="Add person" />
            </td>
        </tr>
        <tr><td colspan="2"><input type="submit" value="send the whole thing" /></td></tr>

 }
 <script>
    $(document).ready(function(){
        $("#btnAddPerson").click(function(event){
            event.stopPropagation();
            $.post("/actionTohandle/addperson", { person : $("#field").val()}, function(data){
                //do something with the result
            })
        })
    })
 </script>

[人物の追加] ボタンをクリックすると、POST リクエストがサーバー側に送信され、FormCollection オブジェクトにはキーが 1 つしかなく、それがコレクション ["フィールド"] になります。私が呼び出しているアクション (AddPerson) は、ActionToHandleController にあります。一方、送信ボタンをクリックすると、PersonsController で EditPersons が呼び出されます。これで、2 つの異なる場所 (コントローラー) で 2 つの異なるアクションを行うことができます。同じ形。この例は氷山の一角にすぎません。これは、ASP.NET MVC の優れた機能の 1 つで、柔軟性が非常に高く、すべてをサーバー側のスクリプトとして処理する必要はありません。

于 2012-10-10T01:25:49.280 に答える
0

このフォームで何を達成しようとしているのかは不明です...編集または作成の1つのフォームのみが必要であり、サーバー(またはクライアント)ロジックを決定する必要があります。ただし、本当に2つの「ネストされた」フォームが必要な場合は、jquery.ajaxメソッドを使用してアクションを呼び出すことを検討できます。

于 2012-10-10T00:30:50.277 に答える
0

私は現在、似たようなことをしています。実行するアクションを入力要素に格納します。

<input type="submit" value="Add person" data-action"/AddPerson">

次に、クリックをサブスクライブするか、フォームの送信時に、.Data()Action=""を使用してフォームをデータアクションに変更します。

于 2012-10-09T22:46:36.050 に答える
0

参考までに、フォーム タグをテーブルに配置すること (つまり、tr タグをラップすること) は HTML として正しくありません。一部の (ほとんどの?) ブラウザーで動作しますが、動作するという保証はなく、モバイル ブラウザーがサポートするという保証もありません。

では、無効なことを行うことを避けるために、無効なことを行うにはどうすればよいかを尋ねることのポイントは何ですか?

これを行う正しい方法は、テーブルをフォームでラップすることです。次に、各行で送信ボタンを使用しますが、それぞれに「Submit_1」などのわずかに異なる ID を与えてから、投稿された値にどのボタンが存在するかによって、どの行ボタンがクリックされたかを把握します。

その他の可能性は、ボタンをクリックしたときに実行される JavaScript を使用することです。

<input type="button" onclick="SubmitMyForm(15)" /> 

行番号 (または使用したいその他の識別子、おそらく jquery を使用してデータ属性値を抽出し、行を識別する) のパラメーターを取る SubmitMyForm というメソッドがある場合。

最後に、テーブルの下部で、フォームのアクション属性を変更する「AddPerson」などの別のメソッドを呼び出してから、form.submit() を呼び出して別のアクションに投稿できます。正直なところ、ほとんどの場合、これを投稿する必要はありません..新しいページにリダイレクトするリンクを使用するだけで済みます.

いずれにせよ、フォームで tr をラップすることが合法であったとしても (これは無効です)、ネストされたフォーム (無効です) は必要ありません。

于 2012-10-09T23:02:33.673 に答える