代码之家  ›  专栏  ›  技术社区  ›  Aaron

在ASP.NET MVC中维护复选框的动态列表的状态

  •  9
  • Aaron  · 技术社区  · 15 年前

    PropertyFeatureID: 2
    Description: "Swimming Pool"
    

    行数(PropertyFeatures)当然可以增长和收缩,因此我想动态呈现复选框列表,以便用户可以选择其中任何一个。 我可以很容易地动态呈现复选框,例如:

    <%foreach (var Feature in (ViewData["Features"] as IEnumerable<MySolution.Models.PropertyFeature>)) { %>
    <%=Html.CheckBox("Features", new { @id = Feature.PropertyFeatureID, @value = Feature.PropertyFeatureID })%><label for="Feature<%=Feature.PropertyFeatureID%>"><%=Feature.Description%></label>
    <%}%>
    

    我为每个复选框指定ID并呈现匹配的标签,这样用户就可以直观地单击标签并切换复选框-这很好。

    提交表单后,我使用选中的值并存储它们,因此我需要实际的整数值,以便知道选择了哪个PropertyFeature,而不仅仅是一堆布尔值和字段名。因此,理想情况下,我希望它是一个数组或一个易于使用的集合。

    单击按钮时,我能够从控制器方法中检索所选的值,因为我已将参数指定为int[]Features。

    但问题是 它不能保持状态。也就是说,当我单击submit按钮并重新加载页面(再次显示表单)时,我希望所有的动态复选框都保持其选中状态(或不选中)。我创建的所有其他字段 Html.DropDownList Html.TextBox 它们都成功地保持了状态,在同一页上以相同的形式完全没有问题。

    我花了几个小时阅读了所有关于类似问题的其他帖子和文章,并且有很多关于使用 ICollection IDictionary 将内容打包并为每个项包含一个布尔值,以便它可以保持复选框状态。但我并没有100%地掌握如何在我个人的例子中使用它。我想保持解决方案非常简单,不必编写新类的页面来维护我的复选框状态。

    什么是最干净和正确的方法来做这件事?

    2 回复  |  直到 12 年前
        1
  •  15
  •   Aaron    12 年前

    我在玩了很多不同的方法之后,它开始工作了。

    在视图中:

    <%string[] PostFeatures = Request.Form.GetValues("Features");%>
    <% foreach (var Feature in (ViewData["AllPropertyFeatures"] as 
                                 IEnumerable<MySolution.Models.PropertyFeature>)) 
       { %>
        <input type="checkbox" name="Features"
            id="Feature<%=Feature.PropertyFeatureID.ToString()%>" 
            value="<%=Feature.PropertyFeatureID%>" 
            <%if(PostFeatures!=null) 
              {
                 if(PostFeatures.Contains(Feature.PropertyFeatureID.ToString()))
                 { 
                    Response.Write("checked=\"checked\""); 
                 }
              }
            %> />
        <label for="Feature<%=Feature.PropertyFeatureID%>">
              <%=Feature.Description%></label>   <%
       }  %>
    

    在接收控制器方法中:

    public ActionResult SearchResults(int[] Features)
    

    • 允许单击标签以切换相应的复选框(可用性)。
    • 重新加载包含表单的页面时保留复选框的选中状态,即保留用户的选择。
    • 不需要大量额外的服务器端臃肿的类、助手和其他令人高兴的乱七八糟的东西来实现这样一件简单的事情。

        2
  •  0
  •   Dave Thieben    15 年前

    问题是,在呈现复选框列表时,没有将任何复选框设置为选中状态。您需要设置 int[] Features 在ViewData中,然后在foreach循环中,检查该功能的ID是否在ViewData的数组中。

    <%=Html.CheckBox("Features", 
        ((int[])ViewData["SelectedFeatures"]).Contains(Feature.PropertyFeatureID),
        new { @id = Feature.PropertyFeatureID, @value = Feature.PropertyFeatureID })%
    

    虽然我没有测试,所以可能不是100%。