在foreach的mvc单选按钮

时间:2011-10-05 20:44:43

标签: asp.net-mvc radio-button

我正在使用MVC,我在foreach中有一些RadioButtons:

    foreach (var item in group) {
                    <tr>
                        <td>
                            @Html.RadioButtonFor(modelItem => item.CheckerApproved, true)
                            @Html.RadioButtonFor(modelItem => item.CheckerApproved, false)
                        </td>
                    </tr>
}

因此,对于组中的每个项目,应该有一个真假的单选按钮。

问题是,当组中有多个项目时,您最终可能会选择两个项目:

<tr>
   <td>
      <input id="item_CheckerApproved" type="radio" value="True" name="item.CheckerApproved">
      <input id="item_CheckerApproved" type="radio" value="False" name="item.CheckerApproved 
         checked="checked">
   </td>
</tr>

<tr>
   <td>
      <input id="item_CheckerApproved" type="radio" value="True" name="item.CheckerApproved">
      <input id="item_CheckerApproved" type="radio" value="False" name="item.CheckerApproved 
         checked="checked">
   </td>
</tr>

我想要的是radiobuttons群体分开。因此,更改第一行中的值不会影响第二行中的值。但是,如果您在顶行设置了say,则在第二行中选择任一值,第一行中的true将被取消。

我相信这是因为它们是通过name属性链接的。但是,您实际上无法手动重置此名称属性。

有没有人知道我怎么能让它工作,所以每一行的真假都相互影响,但对其他行的radiobuttons没有影响?

3 个答案:

答案 0 :(得分:15)

不要在视图中编写循环。它们是丑陋的,你最终会遇到你问题中描述的不良行为。使用编辑器模板,如下所示:

<table>
    <thead>
        <tr>
            <th>Approved status</th>
        </tr>
    </thead>
    <tbody>
         @Html.EditorFor(x => x.Groups)
    </tbody>
</table>

这里我假设您的视图模型具有类型为IEnumerable<GroupViewModel>的Groups集合属性。现在剩下的就是编写相应的编辑器模板,该模板将对Groups集合中的每个元素执行(~/Views/Shared/EditorTemplates/GroupViewModel.cshtml):

@model GroupViewModel
<tr>
    <td>
        @Html.RadioButtonFor(x => x.CheckerApproved, "true") <span>Approved</span>
        @Html.RadioButtonFor(x => x.CheckerApproved, "false") <span>Not approved</span>
    </td>
</tr>

现在不仅您不再需要在视图中编写任何丑陋的foreach循环,而且最终会得到正确的命名约定。

答案 1 :(得分:2)

一种方法是使用for循环和RadioButton而不是RadioButtonFor

@for (int i = 0; i < item.Count; i++)
{
    <tr>
        <td>
            @Html.RadioButton("item_CheckerApproved_" + i, true, item[i].CheckerApproved)
            @Html.RadioButton("item_CheckerApproved_" + i, false, !item[i].CheckerApproved)
        </td>
    </tr>
}

答案 2 :(得分:0)

如何在foreach中使用radiobutton

 @{
    int i = 0;
    foreach(var item in group)
      { 
         i++;
       <tr>
       <td>
          <input id="item_CheckerApproved" type="radio" value="True" name="item.CheckerApproved_@i">
          <input id="item_CheckerApproved" type="radio" value="False" name="item.CheckerApproved_@i 
             checked="checked">
       </td>
    </tr>

    <tr>
       <td>
          <input id="item_CheckerApproved" type="radio" value="True" name="item.CheckerApproved_@i">
          <input id="item_CheckerApproved" type="radio" value="False" name="item.CheckerApproved_@i 
             checked="checked">
       </td>
    </tr>
      }

    }

希望它有所帮助;)