Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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
C# MVC模型绑定在AJAX请求的复杂类型上无法按预期工作_C#_Ajax_Asp.net Mvc 4_Model Binding - Fatal编程技术网

C# MVC模型绑定在AJAX请求的复杂类型上无法按预期工作

C# MVC模型绑定在AJAX请求的复杂类型上无法按预期工作,c#,ajax,asp.net-mvc-4,model-binding,C#,Ajax,Asp.net Mvc 4,Model Binding,我有一个“ViewModel”要传递给我的操作,它如下所示: public class MyClass { public int Id { get; set; } public int MyNumber { get; set; } } public class RequestViewModel { public List<MyClass> MyClasses { get; set; } public int AnotherNumber { get;

我有一个“ViewModel”要传递给我的操作,它如下所示:

public class MyClass
{
    public int Id { get; set; }
    public int MyNumber { get; set; }
}

public class RequestViewModel
{
    public List<MyClass> MyClasses { get; set; }
    public int AnotherNumber { get; set; }
}
我打电话:

    $.ajax({
        type: "Get",
        url: " /Controller/MyAction",
        data: actionRequest,
        dataType: "json",
        traditional: true,
        success: function (data) {
            // Good stuff
        },
        error: function (data) {
            // Bad stuff
        }
    });
我的行动签名:

public ActionResult MyAction(RequestViewModel request)
在检查
请求时
(我的操作成功命中),
将填充另一个编号
,而我的
MyClass
集合为
null

我错过了一些明显的东西,我只是不知道是什么

编辑 我真的很感谢迄今为止的建议和答案,但是(到目前为止)没有一个有效,所以现在我满足于:

public class RequestViewModel
{
    public int[] MyClassIds { get; set; }
    public int[] MyNumberValues { get; set; }
    public int AnotherNumber { get; set; }
}

这样做感觉很糟糕,但现在这是一个有相当多紧迫性的项目,所以我必须继续工作。

尝试使用
JSON。将
字符串化并在ajax请求中修改
数据,如下所示:

data:{ request : JSON.stringify(actionRequest) }
并在ajax请求中添加
contentType:“application/json”


或者试试这个:

var request = {
        MyClasses: [
            {
                Id: 1,
                MyNumber: 30
            },
            {
                Id: 2,
                MyNumber: 40,
            }
        ],
        AnotherNumber: 12
    };

 request = JSON.stringify({ 'request': request });
现在以这种方式在ajax请求中使用
data

data: request 

尝试使用
JSON.stringify
并将ajax请求中的
数据修改为:

data:{ request : JSON.stringify(actionRequest) }
并在ajax请求中添加
contentType:“application/json”


或者试试这个:

var request = {
        MyClasses: [
            {
                Id: 1,
                MyNumber: 30
            },
            {
                Id: 2,
                MyNumber: 40,
            }
        ],
        AnotherNumber: 12
    };

 request = JSON.stringify({ 'request': request });
现在以这种方式在ajax请求中使用
data

data: request 

请尝试以下代码,并将其名称与控制器中的名称相同,如下所示:-

$.ajax({
        type: "POST",
        url: " /Controller/MyAction",
        data: :{ request : JSON.stringify(actionRequest) },
        dataType: "json",
        traditional: true,
        success: function (data) {
            // Good stuff
        },
        error: function (data) {
            // Bad stuff
        }
    });
[HttpPost]
public ActionResult MyAction(RequestViewModel request)
我建议您在操作方法上方尝试POST请求put httpPost属性,如下所示:-

$.ajax({
        type: "POST",
        url: " /Controller/MyAction",
        data: :{ request : JSON.stringify(actionRequest) },
        dataType: "json",
        traditional: true,
        success: function (data) {
            // Good stuff
        },
        error: function (data) {
            // Bad stuff
        }
    });
[HttpPost]
public ActionResult MyAction(RequestViewModel request)

请尝试以下代码,并将其名称与控制器中的名称相同,如下所示:-

$.ajax({
        type: "POST",
        url: " /Controller/MyAction",
        data: :{ request : JSON.stringify(actionRequest) },
        dataType: "json",
        traditional: true,
        success: function (data) {
            // Good stuff
        },
        error: function (data) {
            // Bad stuff
        }
    });
[HttpPost]
public ActionResult MyAction(RequestViewModel request)
我建议您在操作方法上方尝试POST请求put httpPost属性,如下所示:-

$.ajax({
        type: "POST",
        url: " /Controller/MyAction",
        data: :{ request : JSON.stringify(actionRequest) },
        dataType: "json",
        traditional: true,
        success: function (data) {
            // Good stuff
        },
        error: function (data) {
            // Bad stuff
        }
    });
[HttpPost]
public ActionResult MyAction(RequestViewModel request)

我不确定差异在哪里,现在我无法重现错误,但这对我来说是有效的

public class MyClass
{
    public int Id { get; set; }
    public int MyNumber { get; set; }
}

public class RequestViewModel
{
    public List<MyClass> MyClasses { get; set; }
    public int AnotherNumber { get; set; }
}

[HttpPost]
public ActionResult Save(RequestViewModel actionRequestX)
{
        return null;
}

var actionRequest = {
        MyClasses: [
            {
                Id: 1,
                MyNumber: 30
            },
            {
                Id: 2,
                MyNumber: 40
            }
        ],
        AnotherNumber: 12
    };

    $.ajax({
    type: "POST",
    url: "/Home/Save",
    contentType: "application/json, charset=utf-8",
    data: JSON.stringify({ actionRequestX: actionRequest }),
    dataType: "json",
    traditional: true,
    success: function (data) {
        // Good stuff
    },
    error: function (data) {
        // Bad stuff
    }
});
});
公共类MyClass
{
公共int Id{get;set;}
公共整数MyNumber{get;set;}
}
公共类RequestViewModel
{
公共列表MyClass{get;set;}
公共整数另一个数{get;set;}
}
[HttpPost]
公共操作结果保存(RequestViewModel actionRequestX)
{
返回null;
}
var actionRequest={
我的班级:[
{
Id:1,
我的号码:30
},
{
Id:2,
我的号码:40
}
],
另一个号码:12
};
$.ajax({
类型:“POST”,
url:“/Home/Save”,
contentType:“应用程序/json,字符集=utf-8”,
数据:JSON.stringify({actionRequestX:actionRequest}),
数据类型:“json”,
传统的:是的,
成功:功能(数据){
//好东西
},
错误:函数(数据){
//坏东西
}
});
});

我不确定差异在哪里,现在我无法重现错误,但这对我来说是可行的

public class MyClass
{
    public int Id { get; set; }
    public int MyNumber { get; set; }
}

public class RequestViewModel
{
    public List<MyClass> MyClasses { get; set; }
    public int AnotherNumber { get; set; }
}

[HttpPost]
public ActionResult Save(RequestViewModel actionRequestX)
{
        return null;
}

var actionRequest = {
        MyClasses: [
            {
                Id: 1,
                MyNumber: 30
            },
            {
                Id: 2,
                MyNumber: 40
            }
        ],
        AnotherNumber: 12
    };

    $.ajax({
    type: "POST",
    url: "/Home/Save",
    contentType: "application/json, charset=utf-8",
    data: JSON.stringify({ actionRequestX: actionRequest }),
    dataType: "json",
    traditional: true,
    success: function (data) {
        // Good stuff
    },
    error: function (data) {
        // Bad stuff
    }
});
});
公共类MyClass
{
公共int Id{get;set;}
公共整数MyNumber{get;set;}
}
公共类RequestViewModel
{
公共列表MyClass{get;set;}
公共整数另一个数{get;set;}
}
[HttpPost]
公共操作结果保存(RequestViewModel actionRequestX)
{
返回null;
}
var actionRequest={
我的班级:[
{
Id:1,
我的号码:30
},
{
Id:2,
我的号码:40
}
],
另一个号码:12
};
$.ajax({
类型:“POST”,
url:“/Home/Save”,
contentType:“应用程序/json,字符集=utf-8”,
数据:JSON.stringify({actionRequestX:actionRequest}),
数据类型:“json”,
传统的:是的,
成功:功能(数据){
//好东西
},
错误:函数(数据){
//坏东西
}
});
});


取出
数据类型:“json”
吗?您告诉请求您正在发送一个JSON,它是一个字符串,但您正在提供一个对象。要么保留
数据类型
规范并对对象进行字符串化,要么删除该规范。@AndreiV-谢谢你的建议,但没有起作用。我的印象是,所有这些都是作为请求的一部分序列化的?嗯。。。那一定是出了什么事。我必须重新检查我的来源。是的,奇怪的是,
另一个编号填充了,而列表没有。我认为它是空的,因为路由。把
数据类型:“json”
去掉?您告诉请求您正在发送一个JSON,它是一个字符串,但您正在提供一个对象。要么保留
数据类型
规范并对对象进行字符串化,要么删除该规范。@AndreiV-谢谢你的建议,但没有起作用。我的印象是,所有这些都是作为请求的一部分序列化的?嗯。。。那一定是出了什么事。我必须重新检查我的来源。是的,奇怪的是,
另一个编号
被填充,而列表没有。我认为它是空的,因为路由。还有一些额外的东西@Kartikeya,并且仍然在更新:Pby默认请求是get,控制器操作上不需要httpget属性。。Brooh好的,明白了。顺便说一句,我总是搞不清楚放在哪里,什么时候放帖子。分享一些知识,如果你知道的话,根据上面的答案@KartikeyaAs,不幸的是,整个对象现在是空的。我建议尝试使用POST@DeeMachave以及@Kartikeya来做一些额外的事情,并且仍然在更新:Pby默认请求是get only httpget属性在控制器操作上不是必需的。。broohh好的,明白了。顺便说一句,我总是搞不清楚在哪里放置get和何时放置POST。分享一些知识如果你知道@KartikeyaAs根据上面的答案,整个对象现在不幸为空。我建议尝试使用POST@deemac谢谢你的建议,但是现在整个对象在服务器上为空。@DeeMac…尝试上面的答案非常感谢您的建议,但是现在整个对象在服务器上为空。@DeeMac…尝试上面的答案