1

MyViewModelASP.NET MVC 3 と Razor を使用して、クラスに対して厳密に型指定されたビューを作成しました。ビュー内には、ラジオ ボタンのグループで構成される AJAX フォームがあります。その下には、 のデータを収集する通常の HTML フォームがありますMyViewModel。AJAX フォームで選択されているラジオ ボタンに応じて、HTML フォームを既定値のセットまたは別のセットで更新したいと考えています。AJAX フォームで、2 つのデータを投稿しようとしています: 1) 選択されたオプションを表す値 (ラジオ ボタンのvalueパラメーターに基づく)、および 2)Modelビューから。受け取ったオプションに基づいてコントローラー アクションでモデルを更新し、更新されたモデル オブジェクトをパラメーターとして部分ビューを返すようにします。どうすればいいですか?私の試みのAJAXフォームのコードは次のとおりです。

@using (Ajax.BeginForm("MyAction", "MyController",
        new AjaxOptions {
            HttpMethod = "POST",
            InsertionMode = InsertionMode.Replace,
            UpdateTargetId = "createForm"
        })) 
{
    <div id="formOptions">
        @foreach (Option op in Model.GetOptions()) {
            <div class="editor-field">
            @Html.RadioButton("option", op.OptionType, false, new { @id = op.ID, @name = op.ID, @title = @op.Description, @onfocus = "javascript:$(this).closest('form').find(':submit').first().click()" })
            <label for="@op.ID">@op.Name</label>
            </div>
        }
    </div>
    @Html.Hidden("model", Model)
    <input type="submit" value="Select" style="display:none;" />
}

私の問題はmodel、HttPost アクション メソッドのパラメーターが null であることです。ただし、optionパラメーターは正しく渡されるようです。入力を使用してはならHtml.Hiddenない方法で使用しているかどうか、または問題が何であるかはわかりません。必要に応じて、さらにコードを投稿できます。

これは、このようなことを行う最初の試みであるため、(一見) 似たような質問をたくさん読んだ後でも、やりたいことの解決策を解読できません。JSON エンコーディング、JQuery の使用など、さまざまなことを目にしますが、それらが必要かどうか、または MVC 機能を使用してこれを実現できるかどうかはわかりません (既に使用されているものを再コーディングしたくありません)。 MVC に組み込まれています 3)。誰かが私を正しい方向に向けたり、小さなコード例を挙げたりできれば幸いです。そして、私の最終目標が何であるかを考えると、オプション コントロールに基づいてフォームを非同期的に更新するためのより良い方法があれば、非常に興味があります。ありがとう!

編集:

また、HttpPost を使用したリクエストがコントローラーに到達しないことにも気付きましたが、HttpGet は到達します。誰かいる?これは私を夢中にさせています!

コントローラーの追加方法:

public PartialViewResult CreateForm(OptionType opType, MyViewModel model) {
    model.ApplyOptionValues(opType);
    return PartialView("_CreateForm", model);
}
4

2 に答える 2

0

私はMattboに同意します。モデル全体を円で丸く投稿することは不要なオーバーヘッドです。なぜそうなのかはわかりませんが、「古い」値と「新しい」値を比較できるようになっているのではないかと思います。モデルがコントローラーで作成されている場合、モデルの一意の識別子(GUIDなど)をViewModelに含め、それを非表示フィールドに入れてPOSTデータに含めると、POSTの戻り時に「新しい」データが次のようになります。強く型付けされたViewModelに自動マップされます。その後、元のモデルを再取得して、両方で必要なことを行うことができます。

AJAXフォームの処理は別の問題/フォームです。(モデルの表示)フォームにデフォルト値を入力するラジオボタン(選択されたラジオを記録するための非表示フィールドを含む)があり、ユーザーは他のデータを入力しますまた、(ajax以外の)フォーム全体がMyController.MyActionメソッドに送信され、デフォルトのバインダーは、正しい命名規則に従っている場合、フォーム値を自動的にMyViewModelにマップします。したがって、AJAXは実際に投稿されたフォームとは何の関係もありません。あるいは、Mattboも示唆しているように、AJAXですべてを行うことができます。

[脇]すでに知っている場合は許してください。ただし、かみそりのHTMLヘルパーを使用して次のようなフィールドを作成できます。

@Html.EditorForModel()
@Html.EditorFor(model => model.[field name])

コントローラでは、次のようなアクションを作成します。public ActionResult MyAction(){MyViewModel}

[HttpPost]
public ActionResult MyAction(MyViewModel myModel)
于 2012-08-13T08:46:17.823 に答える
0

@Html.Hidden("model", Model) コントローラーに一致する名前/タイプのフォームに必要な特定のアイテムを配置するだけで、モデル全体をコントローラーに戻すことはしません。選択したラジオ ボタンの値と非表示の入力の値を使用して、識別情報をコントローラーに渡し、そこで必要なロジックを実行できます。

そうは言っても、今後の最善の解決策は、JQuery などの JavaScript フレームワークを使用してすべての AJAX リクエストを処理することだと思います。Asp.net MVC を使用すると、組み込みの部分を使用して単純な操作を非常に簡単に実行できますが、より複雑な操作を実行する必要がある場合は、確実に不十分です。正しいツール (JQuery) を使用した場合よりも、制限内で作業するためにより多くの労力を費やすことになります。

[HttpPost] GET メソッドと区別するために、必ず POST アクション メソッドに で注釈を付けてください。

また、詳細な Web デバッガーを使用して、アプリケーションに何が送信されているかを正確に調べてください。大人気のフィドラーが好きです。 http://www.fiddler2.com/fiddler2/

于 2012-08-13T07:23:11.260 に答える