MVC-下拉值不绑定 table 中的所有行

MVC- drop down values not binding for all the rows in a table

型号:

public class EdituserModel  : IEnumerable<EdituserModel>
{
    public int UserID { get; set; }
    public string Status { get; set; }
    public IEnumerator<EdituserModel> GetEnumerator()
    {
        return ((IEnumerable<EdituserModel>)editUser).GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable<EdituserModel>)editUser).GetEnumerator();
    }
}

观点:

<table id="tbltbl_usertable" class="tableasd" cellpadding="0" cellspacing="0">
    <tr>
        <th style="width:115px;text-align: center; ">User Id</th>
        <th style="width:100px;text-align: center;">Status</th>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    @foreach (var user in Model)
    {
        <tr>
            <td class="UserID" style="text-align: center; ">
                <span style="text-align: center;">@user.UserID</span>
            </td>
            <td class="Status" style="text-align: center;">                     
                <select id="SelectedStatusId" name="SelectedStatusId" value="@user.Status" >
                    <option value="A"  selected="selected">Admin</option>
                    <option value="U">Dashboard user</option>
                </select>         
            </td>
        </tr>
    }
</table>

从上面的代码中,UserID 正确显示(8 行 8 个用户)。但是第一行只显示一个下拉列表,后续行不显示。有什么我想念的吗?

您绑定到 select 的方式是错误的。您无法通过设置 select (try it) 的 value 属性在下拉列表中设置 option。此外,您在第一个 option 上设置 selected="selected"。我猜这是在所有下拉菜单中选择的。

"Only one drop down is being displayed for the first row and not the subsequent rows":

我不知道这怎么可能。我已经在我的系统中对此进行了测试,但无法重现。

那么,如何将您的值绑定到下拉列表?您应该使用 MVC 的 DropdownListFor HTML Helper。

@for (var i = 0; i < Model.Count(); i++)
{
    <tr>
        <td class="UserID" style="text-align: center; ">
            <span style="text-align: center;">Model.editUser[i].UserID</span>
        </td>

        <td class="Status" style="text-align: center;">
            @Html.DropDownListFor(m => Model.editUser[i].Status, new SelectList(new[] {
                new { Text = "Admin", Value = "A" },
                new { Text = "Dashboard user", Value = "U" },
            }, "Value", "Text", Model.editUser[i].Status))
        </td>
    </tr>
}

每当您在 MVC () 中循环和创建表单元素时,您应该使用 for 循环而不是 foreach。这会生成适当的 name 属性,这在提交表单时很重要。

(我们通常在 ViewBag 中获取 SelectListItem 并绑定。但是当我们循环时,MVC 中的 DropDownList 助手会出现问题)


“但我不在乎为构成元素赋予适当的名称 或 DROPDOWNLISTFOR 或任何这些东西。我只想绑定我的下拉菜单好吗?":

然后:

@for (var i = 0; i < Model.Count(); i++)
{
    <tr>
        <td class="UserID" style="text-align: center; ">
            <span style="text-align: center;">@Model.editUser[i].UserID</span>
        </td>

        <td class="Status" style="text-align: center;">
            <select id="SelectedStatusId" name="SelectedStatusId">
                <option value="A" @(Model.editUser[i].Status == "A" ? "selected" : "" )>Admin</option>
                <option value="U" @(Model.editUser[i].Status =="U" ? "selected" : "" )>Dashboard user</option>
            </select>
        </td>

    </tr>
}

更新:我现在看到了你关于 Enumerator 的更新。看,这就是为什么我问你 post 所有相关代码。您说您的页面模型是 IEnumerable<EdituserModel>。我的回答仍然有效。将所有 Model[i] 替换为 Model.editUser[i](否则您也将实现 IList