10

JSONオブジェクト(関連性がある場合はJSON化されたノックアウトモデル)をMVCコントローラーにPOSTし、コントローラーに新しいビューを返させようとしています。これを行うために、フォームを使用してデータを送信しています。問題は、コントローラーがJSONを受信したときにJSONを自動的にモデルに変換したいということです。

これにAJAX呼び出しを使用する場合、

var actionModel = new Object();
actionModel.Controls = ko.toJS(self.controls());
var json = JSON.stringify(actionModel);
$.ajax({
    url: "MyController/Preview",
    type: "POST",
    contentType: 'application/json; charset=utf-8',
    cache: false,
    data: json,
    success: function (data) {
    }
});

... JSONオブジェクトは正常に逆シリアル化され、モデルクラスのインスタンスに変換されます。

public ActionResult Preview(ActionModel actionModel) { ... }
public class ActionModel
{
    public List<ControlModel> Controls { get; set; }
}

フォームを使用してこれを実行する場合は、JSONを非表示の入力フィールドに挿入する必要があることを理解していますが、これを実行するときに管理できる最善の方法は、データをシリアル化された文字列として受信することです。

@using (Html.BeginForm("Preview", "MyController", FormMethod.Post, new { id = "previewForm" }))
{
    <input type="hidden" id="hiddenFieldName" />
}

public ActionResult Preview(string hiddenFieldName) { ... }

後で逆シリアル化することもできますが、AJAX呼び出しの場合のように、MVCで変換できれば本当に望ましいです。これは可能ですか?

ありがとう。

4

2 に答える 2

2

XHRを使用せずにフォームを使用してjsonとしてエンコードされたデータを投稿したいとすると、すぐに使用できるとは思いません。

フォームでは、多くのコンテンツタイプを許可していません。 http://www.w3.org/TR/html401/interact/forms.html#form-content-type

jsonを文字列として投稿する場合、jsonのように見える文字列を検索し、そこで逆シリアル化を処理するモデルバインダーを作成することはおそらく可能です。特にこれが奇妙な状況のためだけのものである場合は、最も美しいものではありません。

于 2012-11-04T17:24:49.163 に答える
1

手動で逆シリアル化する代わりに、フォームの投稿イベントをキャッチして独自の投稿を再構築し、JSONオブジェクトを追加することができます。この投稿serializeObjectのメソッドを使用する例を次に示します):

$(document).ready(function () {
    $('form').live('submit', function (e) {
        e.preventDefault();

        var dataToPost = $(this).serializeObject();
        dataToPost.hiddenFieldName = actionModel; //additional object here
        $.ajax({
            type: $(this).attr('method'),
            url: $(this).attr('action'),
            data: JSON.stringify(dataToPost),
            contentType: 'application/json; charset=utf-8',
            success: function (res) {
                //do something...
            }
        });
    });
});
于 2012-11-02T18:57:40.153 に答える