ASP.NET MVC4 - DataTables的复杂模型绑定

时间:2014-05-30 16:16:25

标签: asp.net-mvc-4 datatables model-binding

我有一个复杂的模型,它应该反序列化DataTables请求,该请求不仅包含嵌套对象,还包含列表中的嵌套对象。 DataTablesRequest模型的定义如下:

public class DataTablesRequest
{
    public class Order
    {
        public int column { get; set; }
        public String dir { get; set; }
    }

    public class Search
    {
        public String value { get; set; }
        public bool regex { get; set; }
    }

    public class Column
    {
        public String name { get; set; }
        public bool searchable { get; set; }
        public bool orderable { get; set; }
        public Search search { get; set; }
    }

    public int start { get; set; }
    public int length { get; set; }
    public int draw { get; set; }
    public IList<Column> columns { get; set; }
    public IList<Order> order { get; set; }

}

控制器方法签名为ActionResult List(DataTablesRequest request)。我检查了DataTables发送的查询参数是否正确,然而,它们是模型绑定器拒绝绑定最里面的对象。它正确地为数组分配了正确数量的对象(10个用于列,1个用于顺序),但列表中的对象是默认构造的,没有绑定任何值。

为了完整起见,这是DataTables提出的实际请求:

draw:1
columns[0][data]:FirstName
columns[0][name]:FirstName
columns[0][searchable]:true
columns[0][orderable]:true
columns[0][search][value]:
columns[0][search][regex]:false
columns[1][data]:LastName
columns[1][name]:LastName
columns[1][searchable]:true
columns[1][orderable]:true
columns[1][search][value]:
columns[1][search][regex]:false
columns[2][data]:Title
columns[2][name]:Title
columns[2][searchable]:true
columns[2][orderable]:true
columns[2][search][value]:
columns[2][search][regex]:false
columns[3][data]:Email
columns[3][name]:Email
columns[3][searchable]:true
columns[3][orderable]:true
columns[3][search][value]:
columns[3][search][regex]:false
columns[4][data]:Organization
columns[4][name]:Organization
columns[4][searchable]:true
columns[4][orderable]:true
columns[4][search][value]:
columns[4][search][regex]:false
columns[5][data]:StateAcronym
columns[5][name]:StateAcronym
columns[5][searchable]:true
columns[5][orderable]:true
columns[5][search][value]:
columns[5][search][regex]:false
columns[6][data]:DateAdded
columns[6][name]:DateAdded
columns[6][searchable]:true
columns[6][orderable]:true
columns[6][search][value]:
columns[6][search][regex]:false
columns[7][data]:DateRemoved
columns[7][name]:DateRemoved
columns[7][searchable]:true
columns[7][orderable]:true
columns[7][search][value]:
columns[7][search][regex]:false
columns[8][data]:ExternalReference
columns[8][name]:ExternalReference
columns[8][searchable]:true
columns[8][orderable]:true
columns[8][search][value]:
columns[8][search][regex]:false
columns[9][data]:9
columns[9][name]:
columns[9][searchable]:false
columns[9][orderable]:false
columns[9][search][value]:
columns[9][search][regex]:false
order[0][column]:0
order[0][dir]:asc
start:0
length:10
search[value]:
search[regex]:false

有没有人知道为什么这不起作用?

编辑:我刚才意识到问题在于序列化数据的格式为column[i][attribute],而不是column[i].attribute。它在使用Dictionary<String, String>而不是专用模型时正确序列化,但是我丢失了所有类型信息。我仍然希望使用实际模型来完成这项工作,所以我想我的选择是找到一种方法让模型绑定器为我做(或编写自定义模型),或改变数据的方式在客户端序列化。

1 个答案:

答案 0 :(得分:0)

<强>解决。
显然,模型绑定器将foo.bar.baz之类的参数绑定到嵌套对象,而foo[bar][baz]只能绑定到字典。 jQuery使用后一种方法将对象序列化为查询字符串,生成只能绑定到嵌套字典的查询字符串。

我对jQuery进行了修补以允许可选的点参数序列化,可以找到源代码here。如果其他人需要这个功能,我可以编写一些测试并向jQuery核心提交拉取请求。