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

w00*_*w00 0 c# razor asp.net-mvc-3

我正在使用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>
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

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

我怎样才能做到这一点?

Dar*_*rov 6

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

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

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

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

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

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