0

我已经为此苦苦挣扎了好几个小时,我似乎无法应用任何可行的逻辑。我有一个对象集合,让我们称它们为项目,它们有一个布尔属性来定义它们是否被包括在内稍后添加到篮子时。我遇到的问题是我想要一个列出这些项目的页面,并且每个项目旁边都有一个复选框,用于切换是否包含该项目。

我有这个:

@using(Ajax.BeginForm("UpdateItems", "Controller", null, 
       new AjaxOptions { HttpMethod = "Post"}, new { id = "UpdateItemsForm" })
{
    @foreach(var item in collection)
    {
        @Html.CheckBox("itemIncluded", item.Included)
    }
}

<script>

$("#UpdateItemsForm").change(function ()
{
    $(this).submit();
});

</script>

在控制器中我有

public JsonResult UpdateItems(bool[] itemIncluded)
{
   //Do Something unimportant
}

问题是,在我的控制器中,我得到了一个我想要的布尔数组,但是数组的长度不一致,当我更改复选框时,我将收到一个包含 n 个元素的数组,具体取决于选中的框数,例如,如果我选中 2/4 个框,我将得到一个包含 6 个布尔值的数组。该数组将包含选中框的真和假元素。有什么办法可以强制数组大小,即始终为每个复选框获取一个包含单个元素的数组,如果选中或不选中,则为 true 或 false?

4

2 回答 2

0

我将控制器更改为使用 FormCollection 而不是数组。然后它变成了一个从控制器中的复选框解析文本的简单案例,这是非常愚蠢的“真,假”表示真条件,或“假”表示假。这样,您将始终获得正确长度的数组,并且能够处理复选框的真假条件。另外,一个小提示,为了使它起作用,复选框应该具有唯一的名称,其中包含一些常见的字符串,在我的情况下,我只是这样做了:

{
   var counter = 0;
}

@foreach(var item in Model.collection)
{
   <div class="item">
    @Html.Checkbox("item"+counter.ToString(), item.Included)
   </div>
    count++;
}

然后在控制器中

int counter = 0;
foreach(var item in sessionCollection)
{
    string index = string.Concat("item", counter.ToString());
    string valueFromCheck = formCollection[index];
    if(valueFromCheck == "true,false")
        item.Included = true;
    if(valueFromCheck == "false")
        item.Included = false;
    i++;
}

我知道,这不是最优雅的做事方式,但它确实有效,这很重要,过早的优化和试图成为代码聪明的驴子总是会导致问题。

于 2013-10-25T13:45:50.593 回答
-1

这不是一个错误,这是一个功能 ;)

http://forums.asp.net/t/1314753.aspx

于 2013-10-24T13:37:06.910 回答