我有一个项目列表,我希望用户能够输入一些值选择一个 但是EditorTemplate生成的单选按钮被命名为“Item [x] .SelectedItemId”,所以它们彼此完全独立,我无法获得价值......
我们去展示一些代码。 模特:
public class FormModel
{
public List<ItemModel> Items { get; set; }
public int SelectedItemId { get; set; }
}
public class ItemModel
{
public int ItemId { get; set; }
public string ItemName { get; set; }
public string SomeString { get; set; }
}
观点:
@model FormModel
@using (Html.BeginForm())
{
@Html.EditorFor(m => m.Items)
}
编辑器模板:
@model ItemModel
@Html.RadioButton("SelectedItemId", Model.ItemId)
@Model.ItemName <br/>
@Html.TextBoxFor(m => m.SomeString) <br/>
更新
这就是我想要的:
这就是我得到的:
因此,FormModel.SelectedItemId永远不会获得任何单选按钮的值。
我做错了什么?
答案 0 :(得分:3)
似乎您知道将单选按钮的名称设置为相同是使其工作所必需的。但是,当您使用代码行@Html.RadioButton("SelectedItemId", Model.ItemId)
在编辑器模板中执行此操作时,MVC 3将考虑您处于Items和prepend items [n]的编辑器模板中。
这将创建类似name="Items[0].SelectedIndex"
的名称。如果不是因为下一个单选按钮是`name =“Items [1] .SelectedIndex”。
解决此问题的一种方法是不使用编辑器模板并改为使用foreach
循环。这是一些我能够实现功能的代码。我确认模型绑定适用于SelectedIndex
。
@model FormModel
@{
ViewBag.Title = "Index";
}
@using (Html.BeginForm())
{
foreach (var item in Model.Items)
{
@Html.RadioButtonFor(x => x.SelectedItemId, item.ItemId)
@item.ItemName <br/>
@Html.TextBoxFor(m => item.ItemName) <br/>
}
<input type="submit" value = "submit" />
}
答案 1 :(得分:1)
我遇到了同样的问题,我们用这段代码解决了这个问题。
@Html.RadioButton("", Model.Id, Model.Selected, new { Name = "deliveryMethod" })
您需要显式放置Name属性,因此将使用它来代替EditorFor
执行后获得的名称。