4

我有一个项目列表,我希望用户能够从中输入一些值选择一个但是 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 永远不会获得任何单选按钮的值。

我究竟做错了什么?

4

2 回答 2

3

似乎您知道将单选按钮的名称设置为相同对于使它们起作用是必要的。但是,当您使用代码行在编辑器模板中执行此操作时@Html.RadioButton("SelectedItemId", Model.ItemId),MVC 3 将考虑到您在 Items 的编辑器模板中并预先添加 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" />
    }
于 2012-04-17T15:35:42.537 回答
1

我有同样的问题,我们用这段代码解决了它。

@Html.RadioButton("", Model.Id, Model.Selected, new { Name = "deliveryMethod" })

您需要显式放置 Name 属性,因此将使用它来代替您在EditorFor执行后获得的名称。

于 2012-09-26T12:52:29.493 回答