ASP.NET Core中如何设置运行时绑定下拉框的选中项?
解决方案
方法1:手动构造SelectList指定选中值
在循环渲染编辑行时,为每个下拉框创建新的SelectList,传入当前item的ParentId作为选中值,替换原来的asp-items绑定:
@foreach(var item in Model.MyList) { <form method="post"> <tr> <!-- 其他列保持不变 --> <td> <div class="form-group"> <select asp-for="ParentId" class="form-control" asp-items="@new SelectList(ViewBag.ParentList as IEnumerable<SelectListItem>, "Value", "Text", item.ParentId)"> <option value="0" disabled>Select...</option> </select> </div> </td> <!-- 操作列保持不变 --> </tr> </form> }
原理:SelectList的构造函数最后一个参数可以指定选中项的Value值,渲染时会自动匹配并选中对应的选项。
方法2:使用局部视图解决绑定冲突(更规范)
原代码中编辑行的表单绑定的是父模型MyViewModel的属性,而非循环项MyModel的属性,不仅会导致下拉框选中异常,还可能引发提交时的模型绑定问题。推荐使用局部视图拆分逻辑:
- 创建局部视图
_EditItem.cshtml,模型指定为MyModel:
@model MyModel <form method="post"> <tr> <td> <div class="form-group"> <input asp-for="Id" disabled class="form-control" /> </div> </td> <td> <div class="form-group"> <input asp-for="Code" class="form-control" /> </div> </td> <td> <div class="form-group"> <input asp-for="Name" class="form-control" /> </div> </td> <td> <div class="form-group"> <select asp-for="ParentId" class="form-control" asp-items="@ViewBag.ParentList"> <option value="0" disabled>Select...</option> </select> </div> </td> <td> <div class="form-group"> <button type="submit" asp-action="Edit" class="form-control">Edit</button> </div> </td> </tr> </form>
- 在主视图
Insert.cshtml中循环调用局部视图:
@foreach(var item in Model.MyList) { @await Html.PartialAsync("_EditItem", item) }
原理:局部视图直接绑定MyModel实例,asp-for="ParentId"会自动根据当前item的ParentId值匹配下拉框选项,无需额外设置,同时表单提交时模型绑定也更准确。
内容的提问来源于stack exchange,提问作者NedaM
相关产品推荐
相关产品推荐

