MVC视图同时使用Enum和DB模型时报“类型在当前上下文无效”错误如何解决
解决方案
报错的核心原因是:你不能直接遍历RegistrationProviders枚举类型本身,枚举是类型定义,不是可遍历的集合,需要调用Enum.GetValues()方法获取该枚举下的所有实例集合后才能遍历。
具体修改步骤
- 第一步:修改视图中下拉框的遍历代码
把原有代码中的
@foreach (var provider in RegistrationProviders)
替换为
@foreach (RegistrationProviders provider in Enum.GetValues(typeof(RegistrationProviders)))
如果之前设置了枚举别名,用别名替换代码中的RegistrationProviders即可。
- 第二步:补充扩展方法的命名空间引用
你目前只引用了枚举的命名空间,需要在视图顶部额外添加扩展方法类EnumExtensions所在的命名空间引用,示例:
@using 你存放EnumExtensions类的命名空间
否则GetDescription()扩展方法会无法被识别。
- 第三步(可选,适配编辑场景选中逻辑)
如果是编辑客户的场景,需要自动选中当前客户已保存的选项,可以修改option代码为:
<option value="@provider.GetDescription()" @(Model.IndividualRegistrationProvider == provider.GetDescription() ? "selected" : "")>@provider.GetDescription()</option>
更简洁的优化方案
你可以直接用MVC自带的DropDownListFor方法生成下拉框,无需手动写循环,代码更简洁,还会自动处理选中逻辑:
@{ // 生成枚举选项集合 var providerOptions = Enum.GetValues(typeof(RegistrationProviders)) .Cast<RegistrationProviders>() .Select(p => new SelectListItem { Text = p.GetDescription(), Value = p.GetDescription() }) .ToList(); } <!-- 直接生成带默认提示的下拉框 --> @Html.DropDownListFor(model => model.IndividualRegistrationProvider, providerOptions, "Select Individual Provider", new { @class="form-control" })
内容的提问来源于stack exchange,提问作者JEuvin
相关产品推荐
相关产品推荐

