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