Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果使用GET方法,AJAX请求无法将DateTime传递给服务器_Javascript_Jquery_Asp.net Mvc_Kendo Ui - Fatal编程技术网

Javascript 如果使用GET方法,AJAX请求无法将DateTime传递给服务器

Javascript 如果使用GET方法,AJAX请求无法将DateTime传递给服务器,javascript,jquery,asp.net-mvc,kendo-ui,Javascript,Jquery,Asp.net Mvc,Kendo Ui,我有一个使用剑道控件的表单,当用户单击按钮时,收集这些控件值的AJAX请求将发送到服务器,并根据这些条件下载一个文件。其中一个控件是DateTimePicker $.ajax({ 键入:“POST”, contentType:“应用程序/json;字符集=utf-8”, url:'@url.Action(“MyGenerateReportMethod”), async:true, 数据:getViewModel(), ... }); 函数getViewModel(){ ... viewModel

我有一个使用剑道控件的表单,当用户单击按钮时,收集这些控件值的AJAX请求将发送到服务器,并根据这些条件下载一个文件。其中一个控件是DateTimePicker

$.ajax({
键入:“POST”,
contentType:“应用程序/json;字符集=utf-8”,
url:'@url.Action(“MyGenerateReportMethod”),
async:true,
数据:getViewModel(),
...
});
函数getViewModel(){
...
viewModel.DateFrom=$(“#DateRangeFrom”).data(“kendoDatePicker”).value();
...
返回JSON.stringify({para:viewModel});
}
公共行动结果MyGenerateReportMethod(MyModel段落) { 试一试{ ... } }
公共类MyModel
{ 
公共日期时间?DateFrom{get;set;}
}
上面的简化代码演示了我的情况

我有一个对服务器的POST ajax请求,它传递一个序列化的JSON对象,包括一个Kendo DateTimePicker值

服务器端操作尝试捕获这个JSON对象作为参数,并执行与此问题无关的操作


我的问题是,出于某种原因,我不得不将请求从POST更改为GET。 虽然它使用POST方法工作,但如果我将“POST”更改为“GET”,它将不工作

我检查了Chrome开发者工具中发送的请求,它确实以以下格式发送了JSON对象:(在网络选项卡的查询字符串参数部分)

然而,在服务器端,
mymodelpara
似乎无法成功捕获该对象(如果我从“POST”更改为“GET”)。当所有
DateTime
字段变为
null
时,仍可以绑定其他字段

为什么会发生这种情况,我如何将请求从“POST”更改为“GET”? 谢谢


已编辑

根据一些评论/回答,我尝试将AJAX请求修改为以下代码,但仍然无法工作。。。(同样的行为)


发生这种情况的原因是,GET方法是在头或url中传递数据,而json数据不能通过头传递,请更改传递数据的方法,该方法当前为json格式

你甚至可以这样做:

var fd=新FormData()

fd.append('data',yourData)


并将fd作为直接数据对象发送,这将起作用。

发生这种情况的原因是,GET方法是通过标头或url传递数据,而json数据不能通过标头传递,请更改传递数据的方法,该方法当前为json格式

你甚至可以这样做:

var fd=新FormData()

fd.append('data',yourData)


并将fd作为直接数据对象发送,它将工作。

GET请求没有正文,它在cookie或URL查询字符串中传递参数,因此在查询字符串参数中传递所需的数据,如下所示:

var url = @Url.Action("MyGenerateReportMethod",new {DateFrom="_X_"});
url = url.replace("_X_",$("#DateRangeFrom").data("kendoDatePicker").value());

$.ajax({
    type: 'GET',
    url: url,
    async: true
});

GET请求没有正文,它在cookie或URL查询字符串中传递参数,因此在查询字符串参数中传递所需的数据,如下所示:

var url = @Url.Action("MyGenerateReportMethod",new {DateFrom="_X_"});
url = url.replace("_X_",$("#DateRangeFrom").data("kendoDatePicker").value());

$.ajax({
    type: 'GET',
    url: url,
    async: true
});

GET没有正文,因此请删除
contentType:“application/json;charset=utf-8”
选项(没有坏处,但只适用于帖子),并调整数据,以使ajax调用不受影响

$.ajax({
    type: 'Get',
    url: '@Url.Action("MyGenerateReportMethod")',
    data: getViewModel(),
    ...
});

function getViewModel() {
    var obj = {};
    ...
    obj.DateFrom = $("#DateRangeFrom").data("kendoDatePicker").value();
    ...
    return obj; // return the object, not a stringified object containing another object
}

注意:这假设值的格式与您的服务器区域性相匹配,或者是ISO格式(例如,请求将是
DateFrom:'2016-04-13T16:00:00.000Z'

GET没有正文,因此删除
contentType:“application/json;charset=utf-8”
选项(没有坏处,但只适用于帖子)并调整数据,使ajax调用

$.ajax({
    type: 'Get',
    url: '@Url.Action("MyGenerateReportMethod")',
    data: getViewModel(),
    ...
});

function getViewModel() {
    var obj = {};
    ...
    obj.DateFrom = $("#DateRangeFrom").data("kendoDatePicker").value();
    ...
    return obj; // return the object, not a stringified object containing another object
}

注意:这假设值的格式与您的服务器区域性相匹配,或者是ISO格式(例如,请求将是
DateFrom:'2016-04-13T16:00:00.000Z'

删除
contentType
选项,并且不字符串化数据(GET请求中没有正文)-只需使用
数据:{DateFrom:$(“#DateRangeFrom”)。数据(“kendoDatePicker”).value(),
谢谢你的回答,我试过了,但仍然没有工作……对我来说非常好。@StephenMuecke我已经在OP中更新了我的代码,你能看到我遗漏了什么吗?它只是
getPlanViewModel()函数中返回obj;
而已(不是
返回{para:obj};
)删除
contentType
选项,不要对数据进行字符串化(GET请求中没有正文)-只需使用
data:{DateFrom:$(“#DateRangeFrom”).data(“kendoDatePicker”).value()},
谢谢你的回答,我试过了,但仍然没有工作……对我来说效果非常好。@StephenMuecke我已经在OP中更新了我的代码,你能看到我遗漏了什么吗?它只是
在你的
getPlanViewModel()
函数中的
返回{para:obj};