Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net MVC2复选框问题_Asp.net_Asp.net Mvc 2_Checkbox - Fatal编程技术网

Asp.net MVC2复选框问题

Asp.net MVC2复选框问题,asp.net,asp.net-mvc-2,checkbox,Asp.net,Asp.net Mvc 2,Checkbox,当我使用HTMLHelper复选框时,它会生成2个表单元素。我理解这是为什么,我对此没有问题,除了: 取消选中复选框似乎与“隐藏”值不同步 我的意思是,当我在循环中生成一堆复选框时: <%=Html.CheckBox("model.MarketCategories[" & i & "].Value", category.Value)%> 用户取消选择和复选框,类别值为FALSE,生成的代码为: <input checked="checked" id="mo

当我使用HTMLHelper复选框时,它会生成2个表单元素。我理解这是为什么,我对此没有问题,除了:

取消选中复选框似乎与“隐藏”值不同步

我的意思是,当我在循环中生成一堆复选框时:

<%=Html.CheckBox("model.MarketCategories[" & i & "].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" />

这是错误的,因为该值为False,因此不应选中该复选框


你知道为什么会这样吗?

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

以编程方式选中该框时,它不会设置关联的隐藏字段。通过直接编写复选框的标记而不是使用MVC控件,您可以轻松地解决这个问题

我最近不得不自己做这件事。这是我最讨厌的事


有关这方面的详细信息,请参阅。

这不适用于我,因为我使用的是强类型视图/控制器

我不使用:

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
    }
  }
}
public ActionResult thislookswird(MyCustomModelObject结果)
{
foreach(result.Categories中的KeyValuePair o){
如果(o.Value==True){
//雅达
}
}
}

现在,当我按照您的帖子中的建议调整代码以工作时,两个控件(复选框/隐藏)之间的映射仍然不正确。它采用隐藏组件的值(总是加载页面时的值),而不是复选框,该复选框现在应该是值。

好的,看起来David是对的。正是我对这两个领域如何协同工作的误解导致他的解决方案对我不起作用

如果这对其他人有帮助,以下是我的解决方案及其工作原理:

首先,我必须手工制作大卫所描述的两个领域

<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.
//为复选框呈现一个附加值。这
//解决在请求中未发送未选中复选框的情况。
//发送隐藏的输入可以知道复选框存在
//在提交请求时的页面上。
现在,两个元素具有相同名称的原因是:如果浏览器在找到一个具有有效值的输入值后,将忽略所有具有相同名称的其他输入值。因此,如果浏览器始终返回复选框的值(无论是否选中),则忽略隐藏元素。另一方面,如果未选中复选框,则浏览器不发送复选框值,则复选框后面的元素会将表单属性的值设置为false并返回该值

我的误解是,我认为复选框应始终存储实际财产的价值,因此类似于:

<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。隐藏的“值”应始终为false。复选框的状态(选中或不选中)将决定返回给控制器的是哪个


谢谢大卫。。。有时候,答案可能就在你面前,但如果你的大脑还没有准备好接受,那么其他程序员也无能为力;-)

我得出的结论是,当使用强类型视图/控制器时,复选框助手完全混乱。它的行为完全不是你所期望的。它的状态某种程度上与它所处的最后一个状态有关,但我无法准确地解释到底发生了什么。当我的所有字典成员都是“False”并因此将“False”传递给复选框帮助器时,有时隐藏值为False,有时为true,但复选框似乎总是被选中。。。我完全被搞糊涂了。不管我做什么,Checkbox html helper总是生成一个“checked”复选框(不管传递给函数的值是真还是假)。这是如何通过测试的?最奇怪的是,当我使用“全部清除”和“全部选择”控制器操作时,复选框总是被选中。当我开始手动选择/清除它们时,复选框似乎工作正常。但是控制器操作仅将复选框字典中的值设置为true/false。我不明白为什么这会有什么不同?我相信这是故意的行为,隐藏字段始终保持为false,因为某些浏览器在未选中时根本不发送复选框。因此,您将得到的场景是真/假/假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假-假。隐藏字段只是为了确保它们始终有一些数据可供检查。