Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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对象数组作为ajax调用参数,而不使用jquery?_Javascript_Asp.net Mvc - Fatal编程技术网

使用javascript对象数组作为ajax调用参数,而不使用jquery?

使用javascript对象数组作为ajax调用参数,而不使用jquery?,javascript,asp.net-mvc,Javascript,Asp.net Mvc,我试图在不使用jQuery的情况下将JavaScript对象数组发送到我的ASP.NETMVC控制器。我有一个简单的JavaScript对象数组,如下所示 var data = []; data.push(new person(1, "David")); data.push(new person(2, "Karine")); data.push(new person(2, "Annie")); ...etc function person(_id, _name) { this.id

我试图在不使用jQuery的情况下将JavaScript对象数组发送到我的ASP.NETMVC控制器。我有一个简单的JavaScript对象数组,如下所示

var data = [];

data.push(new person(1, "David"));
data.push(new person(2, "Karine"));
data.push(new person(2, "Annie"));
...etc

function person(_id, _name) {
    this.id = _id;
    this.name = _name;
}
…我希望将其作为ajax调用的参数,如下所示:

var xmlhttp = new XMLHttpRequest();

xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
                    var obj = JSON.parse(xmlhttp.responseText);
                        for (var i = 0; i < obj.length; i++) {                                                
                            if (i == 1) {
                                    alert(obj[i].name);}
                        }
                }
                else {
                    alert('There is an error');
                }
    }
};

xmlhttp.open("GET", "/Home/AjaxTester?id=15&name=dave", true);                             
xmlhttp.send();
public JsonResult AjaxTester(FromUri List<Person> _person)
…以及所接收参数的类别

public class Person
{
    public int id { get; set; } = 0;      
        public string name { get; set; } = "";

        public Person(int _id, string _name)
        {
            this.id = _id;
            this.name = _name;
        }
}

在参数之前需要有
FromUri
命令,如下所示:

var xmlhttp = new XMLHttpRequest();

xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
                    var obj = JSON.parse(xmlhttp.responseText);
                        for (var i = 0; i < obj.length; i++) {                                                
                            if (i == 1) {
                                    alert(obj[i].name);}
                        }
                }
                else {
                    alert('There is an error');
                }
    }
};

xmlhttp.open("GET", "/Home/AjaxTester?id=15&name=dave", true);                             
xmlhttp.send();
public JsonResult AjaxTester(FromUri List<Person> _person)
publicJSONResult AjaxTester(来自URI列表\u个人)

您需要将http方法从GET更改为POST

xmlhttp.open("POST", "/Home/AjaxTester?id=15&name=dave", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(JSON.stringify(data)); 

确保添加setRequestHeader。如果要发送json对象,请将请求头更改为以下内容:

xhr.setRequestHeader("Content-type", "application/json");
我还建议删除查询参数并更新控制器以接受这种类型的对象。您可能还需要在该参数旁边添加[FromBody]

您的控制器的更新应与

public JsonResult AjaxTester([FromBody] List<Person> _person)
public JsonResult AjaxTester([FromBody]列表\u人)

查询字符串中根本不应发送复杂类型。那么,应该在哪里设置复杂类型?消息正文,GET请求除外。规范说服务器应该忽略GET请求的主体。如果要向GET请求发送复杂对象,它可能不应该是GET。@DaveD的方式与客户端代码中的方式相同?如果没有消息正文,则设置内容类型标头没有任何好处。OP正在发送查询字符串中的值。我们就快到了:我按你说的做了,我的控制器触发正常,但是“\u person”的计数总是为0?我所做的一定有问题…我会回顾我所做的!我已经完成了测试,但仍然不起作用:无论我通过xhr.send(data)发送什么,在服务器端总是空的,即使字符串也不起作用,尽管控制器总是被触发的!是否验证您正在使用setRequestHeader?另外,尝试使用JSON.stringiify(data))。我将用它更新我的答案,以便在代码视图中更容易看到。您可能希望首先尝试在没有列表的情况下进行测试。然后,一旦你得到了工作,把清单加回去