2012-05-31 69 views
0

我用复选框助手(剃刀语法)遭受了一个非常奇怪的行为。步骤的顺序是:Asp.Net MVC 3中的复选框的奇怪行为(剃刀)

在指数的ActionResult我建立,将在网络中给出的视图模型:

var viewModel = new MyViewModel 
{ 
    Field1 = service.GetField(), 
    Field2 = otherService.GetField() 
    Field3 = otherService.Class.BooleanField 
}; 

的字段3的“渲染”有:

@Html.CheckBoxFor(model => model.Field3, new { @class = "something" }) 

当页面被加载,我可以看到复选框与检查状态(当布尔值是真的,当然)。

当页面加载时,启动“OnReady”Jquery事件。在这个方法中,我调用(通过AJAX)一个ActionResult来计算基于他从ViewModel接收到的参数的价格。

不知道为什么,但Field3参数为'false',虽然值为true,并且复选框处于选中状态。之后,如果我更改了引发此计算的任何控件,则接收该方法的ViewModel包含此Field3但具有正确的值(true)。

我一直在寻找可能的交互与这个值,但我什么都没有找到,正如我所说的,当AJAX调用时正确地检查该字段。

谢谢!

PS:HTML检索与萤火:

<input id="Field_Field" class="canRequestCalculation" type="checkbox" value="true" name="Field.Field" data-val-required="Mandatory field" data-val="true" checked="checked"> 
<input type="hidden" value="false" name="Field.Field"> 

正如你所看到的状态进行检查,但在隐藏值为false。

信息检索由AJAX调用的jQuery:

$.ajax({ 
    type: "POST", 
    url: "/Controller/PerformCalculation", 
    data: $("#form").serialize(), 
    success: function (data) { 
     //UI Work 
    }, 
    beforeSend: function (data) { 
     //UI Work 
    } 
}); 

正如我所说的,我第二次执行呼叫的形式正确地为真值发送。如果我使用软件小提琴HttpFox检查HTTP调用,“Field.Field”为false,虽然在浏览器中检查检查!

+3

请注意,“CheckBoxFor”呈现值为“false”的复选框和隐藏字段,并且它们都具有相同的名称。它这样做是因为通常,复选框在选中时发布它们的值,在未选中时发布任何值。由于只有具有给定名称的第一个字段才会发布,因此当取消选中该复选框时,隐藏会强制该表单发布'false'。它有可能是你看到的吗? – bhamlin

+0

非常感谢bhamlin。我一直在阅读这篇文章,但我无法理解它是如何与我的问题相关的。是的,隐藏具有“假”值,但复选框具有真实状态。即使它在浏览器中可见! – IoChaos

+1

@loChaos,你能向我们展示如何在准备好的jQuery事件中提交数据吗? –

回答

0

你如何确定复选框的状态在jQuery中?我使用$(“#checkboxId”)。attr(“checked”)来获取它的值。

+0

谢谢雅克斯。信息由jQuery(form.serialize)检索并发布到ActionResult方法。所以复选框的状态是在服务器端确定的,并且是错误的! – IoChaos