4

コントローラー方式があります

[HttpPost]
public ActionResult GetUserData()
{
    return Json(GetCurrentUser());
}

私はこれを次のようなメソッドで$.ajax()と呼んでいます。

ServerCall: function (method, args, callback) {
        $.ajax({
            type: 'POST',
            url: method,
            data: JSON.stringify(args),
            contentType: 'application/json;charset=utf8',
            dataType: 'json',
            success: function (result) {
                if (callback) {
                    callback(result);
                }
            },
            error: function (err) {
            }
        });
    }

呼び出しは次のとおりです。

ServerCall('GetUserData', null, function(data){
});

そのまま、この呼び出しを行うと、$。ajaxは成功して戻りますが、「data」はnullです。デバッグ中、responseTextは空です。サーバー側では、GetUserDataが呼び出され、適切にフォーマットされたJsonオブジェクトが返されます(独自のJSON ActionResultを作成し、データが実際に応答ストリームに書き込まれていることを確認しました。

サーバー側のメソッドにダミーパラメータを追加すると、次のようになります。

[HttpPost]
public ActionResult GetUserData(string temp)
{
    return Json(GetCurrentUser));
}

すべてが完璧に機能します。ブラウザはIE8です。私の質問は、なぜこれが起こっているのか誰かが説明できますか?

アップデート:

以下の回避策に注意してください:私はまだ根本的な原因を知ることに興味があります。

4

2 に答える 2

4

再現なし。

コントローラ:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult GetUserData()
    {
        return Json(new { foo = "bar" });
    }
}

Index.cshtml見る:

<script type="text/javascript">
    var serverCall = function (method, args, callback) {
        $.ajax({
            type: 'POST',
            url: method,
            data: JSON.stringify(args),
            contentType: 'application/json;charset=utf8',
            dataType: 'json',
            success: function (result) {
                if (callback) {
                    callback(result);
                }
            },
            error: function (err) {
            }
        });
    };

    serverCall('@Url.Action("GetUserData")', null, function (data) {
        alert(data.foo);
    });
</script>

結果:'bar'アラートが表示されます(予想どおり)。

于 2012-04-16T06:16:25.027 に答える
4

IE8でダリンのコードを使って再現することができました。根本的な原因はわかりませんが、IE8JSON.stringifyがnullを処理する方法と関係があると思います。変化

data: JSON.stringify(args)

data: args ? JSON.stringify(args) : null

問題を修正しました。

問題は断続的であることに注意してください。10回に1回の呼び出しで障害が発生していました。この変更により、100回を超えるテストで、失敗率はゼロになりました。

于 2012-04-18T18:18:53.900 に答える