Ajax调用未在MVC控制器中标记为IsAjaxRequest

时间:2013-04-28 20:28:07

标签: asp.net-mvc jquery

我只是在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请求的请求?

2 个答案:

答案 0 :(得分:3)

我发现超过五年的this bug表示使用.ajax()使用dataType脚本或JSON会导致标题丢失是一项功能。但我想,Request.IsAjaxRequest()正在寻找那个确切的标题。

作为一种解决方法,你可以尝试做类似的事情:

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

将该标头附加到jQuery发送的每个Ajax调用。

答案 1 :(得分:0)

在尝试了几乎我在网上找到的每个解决方案都没有成功之后,我选择开始使用jQuery Form Plugin,我现在正在服务器端获得格式良好的Ajax请求。

从上面的链接下载插件,然后我用:

替换了我的Ajax JavaScript
$(document).ready(function () {
    $('#createentry').ajaxForm(function () {
        alert("Thank you for your comment!");
    });
});

包含此脚本并测试对以下内容的调用:

Request.IsAjaxRequest();

现在正确返回true。

使用Firebug检查发布的请求是否存在表示请求作为Ajax请求的必需标头:

X-Requested-With XMLHttpRequest