当我使用html Helper Checkbox时,它会生成2个表单元素。我理解为什么会这样,除了以下我没有问题:
取消勾选复选框似乎与“隐藏”值不同步。
我的意思是当我在循环中生成一堆复选框时:
<%=Html.CheckBox("model.MarketCategories[" & i & "].Value", category.Value)%>
并且用户取消选择并选中checkbox.Value为FALSE,生成的代码为:
<input checked="checked" id="model_MarketCategories_0__Value" name="model.MarketCategories[0].Value" type="checkbox" value="true" />
<input name="model.MarketCategories[0].Value" type="hidden" value="false" />
这是错误的,因为值为False,不应选中复选框。
为什么会发生这种情况?
答案 0 :(得分:0)
更糟糕的是,当它被提交时,它显示为“真实,虚假”。非常令人沮丧。
以编程方式选中此框时,它不会设置关联的隐藏字段。您可以通过直接为复选框编写标记而不是使用MVC控件来轻松解决此问题。
我最近自己必须这样做。这是我的宠儿。
有关详细信息,请参阅this link。
答案 1 :(得分:0)
这对我不起作用,因为我使用的是强类型视图/控制器。
我不使用:
public ActionResult ThisLooksWeird(FormCollection result)
{
var winnars = from x in result.AllKeys
where result[x] != "false"
select x;
// yadda
}
我用:
public ActionResult ThisLooksWeird(MyCustomModelObject result)
{
foreach (KeyValuePair<MarketCategory, Boolean> o in result.Categories) {
If (o.Value == True) {
// yadda
}
}
}
现在,当我根据您的帖子中的建议调整我的代码时,两个控件之间的映射(复选框/隐藏)仍然不正确。它取隐藏组件的值(它始终是加载页面时的值)而不是复选框,这是值现在应该是什么。
答案 2 :(得分:0)
好的,看起来大卫是对的。我误解了这两个领域是如何协同工作导致他的解决方案不适合我的。
如果这有助于其他人在这里是我的解决方案及其运作方式:
首先,我必须像大卫所描述的那样手工制作这两个领域......
<input <%
If category.Value = True Then
%> checked <%
End If
%> class="filterCheckbox" id="model_MarketCategories_<%=i%>__Value" name="model.MarketCategories[<%=i %>].Value" type="checkbox" value="true" />
<input name="model.MarketCategories[<%=i%>].Value" type="hidden" value="False" />
现在快速回顾为什么有两个字段:
// Render an additional <input type="hidden".../> for checkboxes. This
// addresses scenarios where unchecked checkboxes are not sent in the request.
// Sending a hidden input makes it possible to know that the checkbox was present
// on the page when the request was submitted.
现在两个元素具有相同名称的原因是:如果浏览器在找到具有有效值的输入值后将忽略具有相同名称的所有其他输入值。因此,如果您的浏览器始终返回复选框的值(无论是否选中),则忽略隐藏元素。另一方面,如果未选中复选框,则浏览器不会发送复选框值,则紧跟在复选框后面的元素会将form属性的值设置为false并返回THAT。
我的误解是我认为复选框应该始终存储实际属性的值,如下所示:
<input <%
If category.Value = True Then
%> checked <%
End If
%> class="filterCheckbox" id="model_MarketCategories_<%=i%>__Value" name="model.MarketCategories[<%=i %>].Value" type="checkbox" value="<%=category.Value %>" />
这就是造成问题的原因......复选框'value'应始终为true。隐藏的“价值”应始终为假。并且复选框(已选中或未选中)的状态将决定将哪些内容返回给您的控制器。
感谢大卫......有时答案就在你面前,但如果你的大脑还没有准备好接受,那么程序员就无法做到; - )