Enum字段下拉框value为显示文本而非整数值的问题咨询
这个问题是因为内置枚举下拉渲染逻辑在开启本地化后,默认会把枚举的显示文本同时赋值给value属性和显示内容,你可以通过以下方式解决:
方案1:手动构造下拉选项(最稳妥,适用所有场景)
不要直接使用Html.GetEnumSelectList<Enum>()这类默认方法生成选项,自己遍历枚举值手动构造SelectListItem集合,显式指定Value为枚举对应的整数值,Text为本地化文本即可。
示例代码:
// 假设你的枚举定义如下 public enum AuditStatus { No = 0, Yes = 1 } // 构造选项集合(如果是在Controller里构造可以注入IStringLocalizer做本地化,在Razor视图里写也同理) var enumOptions = Enum.GetValues<AuditStatus>() .Select(status => new SelectListItem { Value = ((int)status).ToString(), // 此处替换为你项目实际使用的本地化逻辑 Text = _localizer[status.ToString()].Value }).ToList();
视图层绑定生成的enumOptions即可:
<!-- Tag Helper写法 --> <select asp-for="InvCategory.Status" asp-items="enumOptions" class="custom-select form-control"></select> <!-- HtmlHelper写法 --> @Html.DropDownListFor(m => m.InvCategory.Status, enumOptions, new { @class = "custom-select form-control" })
方案2:自定义扩展方法复用逻辑
如果项目里大量用到枚举下拉,你可以自己封装一个GetEnumIntValueSelectList的扩展方法,把上面手动构造的逻辑封装进去,全局调用即可,不用每次重复写。
额外排查点
如果你用了第三方的枚举本地化/自动渲染组件,可以查下对应组件的配置项,一般都有单独的开关可以控制value属性使用枚举原始值/整数值,不用改现有渲染逻辑。
修复后你最终得到的下拉代码应该是如下结构:
<select class="custom-select form-control" data-val="true" data-val-required="Status 字段为必填项" id="InvCategory_Status" name="InvCategory.Status"> <option selected="selected" value="1">是</option> <option value="0">否</option> </select>
内容的提问来源于stack exchange,提问作者Arnold S
相关产品推荐
相关产品推荐

