0

私がこのようなことをしようとすると:

$.post('@Url.Action("PostComment")', {"Id":32,"Title":"=","Desc":"=",}, function (data) {
    ....
}

私のコントローラーは FormCollection でこの値を受け取ります:

public ActionResult PostComment(FormCollection comment) {
    ....
}

奇妙なことに、値は次のようになります。

","Desc":"="}

(値は以下で作成: JSON.stringify( { Id: 32, Title: "=", Desc: "=" })

ただし、文字が「=」以外の場合、オブジェクトは正しく受信されます。

この特殊文字を含む JSON オブジェクトを送信するにはどうすればよいですか? MVC3 はこれらの値を処理できないようです...

4

1 に答える 1

1

本当に何を送信しようとしているのか少し混乱したので、両方のケースについて説明します。

JavaScript スニペットとアクション メソッドは、送信していることを示していますapplication/x-www-form-urlencoded。その場合JSON.stringify、データに対して を使用しないでください。すべて正常に動作するはずです。

しかし、本当に JSON ( ) を送信したい場合はapplication/json、最初に JavaScript を少し変更する必要があります。

$.ajax({
    type: 'POST',
    url: '@Url.Action("PostComment")',
    data: JSON.stringify( { Id: 32, Title: '=', Desc: '=' }),
    contentType: 'application/json',
    success: function(result) {
    ...
    }
});

エンティティのクラスも取得する必要があります (データにも使用できapplication/x-www-form-urlencodedます)。

public class Comment
{
    public int Id { get; set; }

    public string Title { get; set; }

    public string Desc { get; set; }
}

これにより、アクション メソッドを次のように変更できます (これもapplication/x-www-form-urlencodedデータに対して行うことができます)。

public ActionResult PostComment(Comment comment)
{
    ...
}

ASP.NET MVC はデータを適切にバインドします。データを正しい形式で正しいコンテンツ タイプで送信していることと、JSON をオブジェクトにバインドする必要があることを確認してください。

アップデート

あなたのコメントから出てきたもう 1 つのシナリオがあります - フォームのフィールドの値として JSON を投稿します。これを実現するには、JavaScript を次のように変更することから始める必要があります。

$.post('@Url.Action("PostComment")', { jsonComment: JSON.stringify({ Id: 32, Title: '=', Desc: '=' }) }, function (data) {
    ...
});

これで、次の 2 つの方法のいずれかで未加工の JSON にアクセスできますFormCollection

[HttpPost]
public ActionResult PostComment(FormCollection fields)
{
    string jsonComment = fields["jsonComment"];
    ...
}

または直接名前で:

[HttpPost]
public ActionResult PostComment(string jsonComment)
{
    ...
}

JSON を直接操作できないため、このラッピングが必要ですFromCollection。JSON 用に設計されていません。適切なフォーム データを投稿する必要がありますが、JSON を値として問題なく使用できます (また、そのフォーム データに他の単純な値を含めることもできます)。

于 2012-10-03T11:40:18.910 に答える