0

アプリケーションでいくつかの例外処理クラスとコードをテストしながら、Fiddler でいくつかの Ajax リクエストを見ているだけですが、リクエストが適切に形成されているかどうかはわかりません。

私のJavascriptは:

$(function () {
    $('#createentry').submit(function () {
        e.preventDefault();
        $.ajax({
            url: this.action,
            type: this.method,
            dataType: "json",
            data: $(this).serialize(),
            success: function(result) {
                $('#entries-list').append("<li>" + $('#newentry').val() + "</li>");
                $('#newentry').val('').blur();
            },
            error: function (xhr)
            {
                try
                {
                    var json = $.parseJSON(xhr.responseText);
                    alert(json.errorMessage);
                }
                catch (e)
                {
                    alert('something bad happened');
                }
            }
        });
        return false;
    });
});

Fiddler では、リクエストは次のようになります。

Host: localhost:54275
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost:54275/Diary
Cookie: __RequestVerificationToken= <snipped for brevity>
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 216

Accept: ヘッダーが自動的に json に設定されることを期待しますが、これは間違った仮定だと思います。これはどのように設定されていますか?

また、アクション メソッドでこの結果を見ると、値は常に false です。

    [HttpPost, ValidateAntiForgeryToken, JsonExceptionFilter]
    public JsonResult PostNewEntry(DiaryEntryViewModel diaryEntry)
    {
        var req = Request.IsAjaxRequest();

req always = false であるため、私の JsonExceptionFilter が開始されず、エラー報告が期待どおりに処理されません。

MVCでAjaxリクエストとして正しく設定されたリクエストのみを強制的に受け入れる定義された方法もありますか?

4

2 に答える 2

3

スクリプトまたは JSON を使用するとヘッダーが欠落するという 5 年以上前のこのバグが機能であることがわかりました。しかし、その正確なヘッダーを探していると思います。.ajax()dataTypeRequest.IsAjaxRequest()

回避策として、次のようなことを試すことができます。

$(document).ajaxSend(function (event, request, settings) {
    request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
});

これにより、jQuery が送信するすべての Ajax 呼び出しにそのヘッダーが追加されます。

于 2013-04-28T20:48:10.967 に答える