JSON.stringify()ModelBinding返回null模型

时间:2017-12-27 16:31:40

标签: c# json asp.net-mvc

正如问题标题所示,我试图通过$ajax调用MVC控制器绑定到控制器中的类实体来发布一个数组集合(如果你喜欢的数组数组)。我已经找到了关于这个主题的所有问题,但我似乎无法让它发挥作用,模型根本不会受到约束。

虽然能够绑定到类实体会很好,但我会满足于能够处理'数组数组',但即使这样也不行。我无法将数组作为控制器参数中的“数组”读取。

任务

具有变量但可能具有大量复选框(> 500)的HTML页面需要将每个复选框的两个唯一引用发送回控制器以进行处理的所有值(包括假值)。这两个唯一引用是复选框id的一部分,并在添加到数组之前分开。

问题

从MVC视图通过$ajax调用发布时,数据被字符串化(通过JSON.stringify())控制器响应并初始化适当数量的chkBox类实体,但不填写类实例属性。 (即我获得n chkBox个实体,所有属性都设置为null

Fiddler验证值是以JSON格式发布的,如果我编写自己的I modelbinder,则值会显示在流中,因此值实际上会传递给控制器​​。

如果我将一组三个单独的值传递给控制器​​,也会发生相同的情况,但是如果我将三个值的集合作为单个数组传递,则控制器将使用单个chkBox实体进行响应,但所有三个property-values设置为null

用于创建JS'chkBox对象'的Javascript函数

function chkBox(unqReference_01, unqReference_02, boolean) {
    this.unqReference_01 = unqReference_01;
    this.unqReference_02= unqReference_02;
    this.IsChecked = boolean;
}

视野中的Javascript

var _chkBoxes = [];

$("input:checkbox[name^='chkCompetitor']").each(function () {
    if (_chkBoxes.length < 5) {
        var splitID = $(this).attr('id').split("_");
        var entry = new chkBox(splitID[1], splitID[2], true);
        if (_chkBoxes.indexOf(entry) == -1) {
            _chkBoxes.push(entry);
        }
    }
});

//Submit _chkBoxes
var updateMatrix = $.ajax({
    type: "POST",
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    //traditional: true,
    url: '/Processing/updateMatrix',
    data: JSON.stringify(_chkBoxes)          
});

原始类:(产生错误行为的类)

[SerializableAttribute]
public class chkBox
{
    String unqReference_01 { get; set; }
    String unqReference_02 { get; set; }
    String IsChecked { get; set; }

    public chkBox()
    {

    }
}

编辑:解决方案(太简单了)

将所有类属性设置为public ...

已编辑的课程

[SerializableAttribute]
public class chkBox
{
    public String unqReference_01 { get; set; }
    public String unqReference_02 { get; set; }
    public String IsChecked { get; set; }

    public chkBox()
    {

    }
 }

控制器:

[HttpPost]
public JsonResult UpdateMatrix(General.chkBox[] chkBoxes)
//public JsonResult UpdateMatrix(IEnumerable<General.chkBox> chkBoxes)
//public JsonResult UpdateMatrix(string IsChecked, String unqReference_01, String unqReference_01)
{

    return null;
}

是:

  • ASP.NET MVC 5.2.3
  • EF 6.2.0
  • jQuery 3.2.1

阅读&amp;尝试:

标题截图

请注意,标题使用了班级的实际名称。属性,属性匹配两端(即在JSON和类中) uBoatKey = unqReference_01 uDivisionRaceKey = unqReference_02

enter image description here

1 个答案:

答案 0 :(得分:0)

@BrianRogers给出了最有用的评论,该类的属性声明为'just'

String unqReference_01 {get; set;}

显然应该是

public String unqReference_01 {get; set;}

干杯去@BrianRogers提供评论。