2010-02-24 77 views
1

当我使用html助手复选框时,它会生成2个表单元素。我明白这是为什么,除此之外我没有任何问题:MVC2复选框问题

取消勾选复选框似乎与'隐藏'值不同步。

我的意思是,当我有一大堆的复选框在一个循环中产生:

<%=Html.CheckBox("model.MarketCategories[" & i & "].Value", category.Value)%> 

和用户取消选择和复选框和category.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" /> 

这是错误的,因为值是假的复选框不应该被检查。

任何想法为什么会发生这种情况?

+0

我相信这是预期的行为,则隐藏字段始终保持为false,因为某些浏览器在未选中时不会发送复选框。所以你会得到的场景是 真/假 假/假 假 所以基本上,如果其中一个输入为真,其检查,否则它不检查。隐藏的领域只是为了确保他们总是有一些数据在那里检查。 – dnolan 2010-05-10 16:37:53

回答

0

更糟的是,当它被提交时,它显示为“真实的,错误的”。非常令人沮丧。

当您以编程方式选中该框时,它不会设置关联的隐藏字段。您可以通过直接编写复选框的标记而不是使用MVC控件来轻松解决此问题。我最近不得不自己做这件事。这是我的宠物。

有关更多信息,请参阅this link

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 
    } 
    } 
} 

现在,当我适应我的代码工作,因为在你的帖子提出,两个控件之间的映射(复选框/隐藏)仍然不正确。它采用隐藏组件的值(它始终是页面加载时存在的值),而不是现在值的复选框。

+0

我得出结论,当使用强类型的视图/控制器时,复选框助手完全搞砸了。这是行为完全不是你所期望的。它的状态不知何故与它所处的最后一个状态有关,但我无法解释到底发生了什么。当我所有的字典成员都是“False”,因此将“False”传递给复选框助手时,有时隐藏的值是false,有时候它是真的,但总是复选框似乎被检查......我很困惑。 – Bitfiddler 2010-02-25 00:43:20

+0

无论我做什么,Checkbox html helper都会生成一个'checked'复选框(不管传入函数的值是true还是false)。这是如何通过测试? – Bitfiddler 2010-02-25 01:06:26

+0

最奇怪的是,当我使用我的'全部清除'和'全部选择'控制器操作时,复选框总是回来选中。只要我开始手动选择/清除它们,复选框似乎正常工作。但是控制器操作只会将复选框Dictionary中的值设置为true/false。我不明白为什么这会有所作为? – Bitfiddler 2010-02-25 01:19:29

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" /> 

现在快速回顾一下为什么有2场:

// 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. 

现在的原因两个元件有相同的名称是这样的:如果浏览器会忽略具有相同名称的所有其他输入值一旦为f用一个有效的价值ound。所以如果你的浏览器总是返回复选框的值(不管是否被选中),那么隐藏的元素将被忽略。另一方面,如果未选中复选框,则浏览器不发送复选框值,则紧跟在该复选框后面的元素将将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 %>" /> 

这是什么造成的问题...复选框“价值”应该总是为真。隐藏的“价值”应该始终是错误的。这是复选框的状态(选中或不选),将决定将哪些内容返回给控制器。

感谢大卫......有时候答案可能就在你的面前,但如果你的大脑还没有准备好接受,没有什么资深程序员可以做;-)