MVC模型绑定在AJAX请求的复杂类型上无法正常工作

时间:2014-09-10 08:48:31

标签: 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; set; }
}

在javascript中,我定义了我的数据:

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

我打电话:

    $.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)

在检查request(我的操作已成功点击)时,会填充AnotherNumber,而我的MyClass集合为null

我在这里遗漏了一些明显的东西,我只是不知道是什么。

修改

到目前为止,我真的非常感谢这些建议和答案,但没有(到现在为止)有效,所以现在我要安排:

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

这样做感觉太可怕了,但现在这个项目背后有一点紧迫感,所以我必须选择合适的方式。

3 个答案:

答案 0 :(得分:3)

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

$.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
        }
    });

我建议尝试POST请求把httpPost属性放在动作方法之上,如下所示: -

[HttpPost]
public ActionResult MyAction(RequestViewModel request)

答案 1 :(得分:1)

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

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 

答案 2 :(得分:0)

我不确定区别在哪里,现在我无法重现错误,但这对我有用。

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
    }
});
});