在BeginForm中使用Foreach并在RadioButtonFor()元素中显示元素

时间:2012-05-08 13:36:35

标签: c# asp.net-mvc-3 razor

我正在使用C#.NET MVC3(Razor)来创建一个简单的表单。但在那种形式中,我需要以radiobuttons的形式打印列表的内容。但我不确定这是如何工作的:

@using(Html.BeginForm("Method", "Controller", FormMethod.Post))
{
    foreach (Items item in Model.Items)
    {
        <div>
            @Html.RadioButtonFor(item->itemId)
            @Html.LabelFor(item->description)
        </div>
    }
}

但这不起作用。

我可以使用普通的html标签来创建单选按钮。但那么数据不会自动保存在右边?

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:6)

我建议您使用编辑器模板而不是编写这些循环:

@model MyViewModel
@using(Html.BeginForm("Method", "Controller", FormMethod.Post))
{
    @Html.EditorFor(x => x.Items)
}

现在定义一个相应的编辑器模板,该模板将自动为模型的每个元素(~/Views/Shared/EditorTemplates/ItemViewModel.cshtml)呈现:

@model ItemViewModel
<div>
    @Html.RadioButtonFor(x => x.itemId, "1")
    @Html.LabelFor(x => x.description)
</div>

请注意,除了选择相应视图模型属性的lambda表达式之外,还必须将第二个参数传递给Html.RadioButtonFor帮助器。此参数表示如果用户在提交表单时选中此单选按钮,将发送到服务器并绑定到相应属性的值。

另请注意,这符合惯例。如果我们假设主视图模型中的Items属性是IEnumerable<ItemViewModel>类型,那么您必须定义的相应编辑器模板以及将为此集合的每个元素呈现的相应编辑器模板为~/Views/Shared/EditorTemplates/ItemViewModel.cshtml或{{1如果您不希望在多个控制器之间共享此模板。

答案 1 :(得分:2)

当你在foreach循环中时。以下将有效。

foreach (Items item in Model.Items)
{
    <div>
        @Html.RadioButtonFor(item.itemId)
        @Html.LabelFor(item.description)
    </div>
}

如果您想要保存它们,您需要实现基于零索引的解决方案,如下所示

@{int i = 0}
foreach (Items item in Model.Items)
{
    <div>
        @Html.RadioButtonFor(model =>model[i].itemId)
        @Html.LabelFor(model =>model[i].description)
    </div>
    i++;
}

答案 2 :(得分:0)

语法略有不同:

@Html.RadioButtonFor(model => item.ItemId)
@Html.LabelFor(model => item.Description)

其他一切看起来都不错。

[编辑]哇,我一定很累。是的,以下看起来很好,但仅适用于显示。检查Darin的编辑器模板答案。

[EDIT2]这个问题并不是很明显,但从你的评论中可以看出,foreach中的item是另一个可枚举的。然后嵌套foreach循环,以显示属性:

@foreach(var itemList in Model.Items)
{
    foreach(var item in itemList)
    {
        <div>
            @Html.RadioButtonFor(model => item.ItemId)
            @Html.LabelFor(model => item.Description)
        <div>
    }
}

那是吗?我还不确定我是否理解正确。 :)