1

コントローラーパラメーターでバインディングを使用しないように意図的に試みているため、次のようなコントローラーがあります。

 [HttpPost]
        public ActionResult UntypedForm(String serializedformdata)
        {
        //// ...
        }

以下のコードを使用して、シリアル化された JSON フォーム要素をコントローラーに投稿すると:

var formelements = $('#form').serializeArray();
$.post(url, formelements, function (data) {

    }, "json").error(function () {
        alert("Error posting to " + url); 
    });

コントローラーで String serializedformdata の NULL 値を取得します。ただし、 String serializedformdata を厳密に型指定されたオブジェクトに置き換えると、バインドは期待どおりに正しく機能します。

私のコントローラーの全体的なポイントは、BSON ドキュメントを作成して Mongo データベースに配置する、一般的な JSON 投稿です。SO ....私は意図的にモデルバインディングを望んでおらず、シリアル化された文字列をパマメーターとして望んでいます。投稿時に serializedformdata 文字列が null になるのはなぜですか?

注 - 私も Dictionary にバインドしようとしました

public ActionResult UntypedForm(Dictionary<string,string> serializedformdata)
            {
            //// ...
            }

しかし、serializedformdata はまだ null です。

4

1 に答える 1

2

この関数serializeArrayは、フォームのキーと値のペアを使用して Javascript オブジェクトを作成します。serializedformdata=(JSON文字列)を含む単一のキー/値が必要です。つまり、このように;

var formelements = { serializedformdata: JSON.stringify($('#form').serializeArray()) };

これにより、生の JSON 文字列がコントローラーのパラメーターに渡されます。を使用しJavaScriptSerializerて、サーバー上のオブジェクトを取得できます。

var obj = (List<Dictionary<string,string>>)new JavaScriptSerializer().Deserialize(serializedformdata, typeof(List<Dictionary<string,string>>));
Dictionary<string,string> dict = obj.First();
string someval = dict["somekey"];
于 2012-09-22T02:03:01.820 に答える