名称-值对列表,具有与JavaScript对象重复的名称

名称-值对列表,具有与JavaScript对象重复的名称,javascript,asp.net-mvc-3,telerik,telerik-grid,Javascript,Asp.net Mvc 3,Telerik,Telerik Grid,为了从绑定Telerik MVC网格的AJAX调用向服务器提交表单数据,我们可以将e.data in event设置为匿名JavaScript对象 <script type="text/javascript"> function Grid_onDataBinding(e) { var categoryValue = "Beverages"; var priceValue = 3.14; // pass additional values by sett

为了从绑定Telerik MVC网格的AJAX调用向服务器提交表单数据,我们可以将e.data in event设置为匿名JavaScript对象

<script type="text/javascript">
function Grid_onDataBinding(e) {
     var categoryValue = "Beverages";
     var priceValue = 3.14;

     // pass additional values by setting the "data" field of the event argument
     e.data = { 
        // the key ("category") specifies the variable name of the action method which will contain the specified value
        category: categoryValue,
        price: priceValue
     };
}
</script>
提交这些数据时,提交的数据

选中复选框时,
myCheckBox=true&myCheckBox=false

myCheckBox=false
-未选中复选框时

对于没有复选框的页面,可以通过

e.data = form.serializeObject()
其中通过循环所有表单字段创建该对象。当存在上述复选框时,如何在窗体中构造该对象?基本上,当名称允许重复时,名称-值对列表如何以对象形式表示

e.data = { 
    textBox1: "some value1",
    myCheckBox: true //,
    //myCheckBox: false // ???
};

的实现为这些表单元素创建一个数组,这些元素作为
myCheckBox[]=true&myCheckBox[]=false提交,这会破坏服务器端的模型绑定。

您可以选择要序列化的特定表单子元素,而不仅仅是序列化整个表单。这允许您过滤掉您不想要的内容:

$('form input:not([type=hidden])').serializeObject();
编辑:根据@amit\u g的评论,选中复选框时需要复选框,未选中时需要隐藏元素。这需要比
:not
选择器更复杂的过滤器:

$('form input')
    .filter(function() {
        if ($(this).attr('type') == 'hidden') {
            // filter out those with checked checkboxes
            var name = $(this).attr('name');
            return !$('form input[type=checkbox][name=' + name +']')
                .prop('checked');
        } else {
            // include all other input
            return true;
        }
    })
    .serializeObject();
请参见此处正在工作的JSFIDLE:

serializeObject在内部使用并仅序列化实际提交的元素。因此,使用下面的代码,我禁用了与复选框对应的隐藏字段,并添加了一个更改事件来切换每个隐藏输入上的解除锁定状态。因为输入被禁用,所以它们不会被序列化

.serializeArray()方法使用标准W3C规则 成功控制,以确定应包括哪些要素;在里面 无法禁用特定元素,该元素必须包含名称 属性未序列化任何提交按钮值,因为表单未被序列化 使用按钮提交。文件选择元素中的数据不可用 连载


当然,但这打破了最根本的原因,MVC框架从这些字段开始。浏览器不会提交未选中的复选框,即框架使用这些隐藏字段进行模型绑定时。
$('form input')
    .filter(function() {
        if ($(this).attr('type') == 'hidden') {
            // filter out those with checked checkboxes
            var name = $(this).attr('name');
            return !$('form input[type=checkbox][name=' + name +']')
                .prop('checked');
        } else {
            // include all other input
            return true;
        }
    })
    .serializeObject();
$('form.form-class :checkbox').change(function () {
    enableDisableCorrespondingHiddenField($(this));
});

$('form.form-class :checkbox').each(function () {
    enableDisableCorrespondingHiddenField($(this));
});

enableDisableCorrespondingHiddenField(checkbox) {
    $(":hidden[name='" + checkbox.attr("name") + "']", checkbox.parent()).attr("disabled", checkbox.attr("checked"));
}