HTML select下拉框无法正确回显绑定选中值是什么原因
问题根因
你的代码存在两个核心错误,直接导致回显异常:
- 属性使用完全错误:非空分支下你写的
onselect="@Model.Period"没有任何设置选中项的作用。onselect是DOM事件属性,仅当元素内文本被用户选中时触发对应JS逻辑,和下拉选项的选中状态毫无关系。 - 未手动指定选中项时,浏览器会按照默认规则选中第一个未设置
disabled属性的option:- 你没有给Days选项加disabled时,第一个可用选项是value=1的Days,因此无论传入什么值都默认显示Days
- 你给Days选项加了disabled后,第一个可用选项变成value=2的Week,因此无论传入什么值都默认显示Week
额外注意:你给select标签加disabled="disabled"时,这个表单字段在提交时不会向后端传递值,如果需要保留提交能力又要禁止用户修改,应该用readonly属性配合样式实现,或者加隐藏域存值。
修复代码
不需要拆分两段if/else写两个几乎完全一致的select,直接在标签和option层面做条件判断即可,代码更简洁也不会出现逻辑遗漏:
<div class="col-sm-2"> <select name="Period" id="ddlPeriod" @(Model.Period == 0 || Model.Period == null ? "disabled='disabled'" : null)> <option value="0" disabled="disabled" @(Model.Period == 0 || Model.Period == null ? "selected='selected'" : null)>select period</option> <option value="1" @(Model.Period == 1 ? "selected='selected'" : null)>Days</option> <option value="2" @(Model.Period == 2 ? "selected='selected'" : null)>Week</option> <option value="3" @(Model.Period == 3 ? "selected='selected'" : null)>Month</option> <option value="4" @(Model.Period == 4 ? "selected='selected'" : null)>Year</option> </select> </div>
如果使用ASP.NET Core MVC,更推荐用内置的Select Tag Helper做模型绑定,不需要手动写selected判断,框架会自动根据模型值匹配选中项:
@* 先定义周期枚举,1=Days/2=Week/3=Month/4=Year *@ <div class="col-sm-2"> <select asp-for="Period" id="ddlPeriod" asp-items="Html.GetEnumSelectList<PeriodType>()" disabled="@(Model.Period == 0 || Model.Period == null)"> <option value="0" disabled>select period</option> </select> </div>
内容的提问来源于stack exchange,提问作者Riya
相关产品推荐
相关产品推荐

