如何在多个控制器中复用自定义的SelectListItem下拉选项列表
复用方案
你可以根据项目的架构习惯选以下任意一种实现,都能做到仅修改一处代码全局生效,且无额外数据库开销:
方案1:封装公共静态工具类(最适配你的需求,实现最简单、性能最优)
因为你的列表改动概率极低,用静态类+静态字段缓存的方式,不会每次调用都重复初始化列表,性能消耗可以忽略:
public static class CommonSelectProvider { // 静态字段全局仅初始化一次,常驻内存 private static readonly List<SelectListItem> _bankRegionSelectList = new List<SelectListItem>() { new SelectListItem { Text = "" , Value = "", Selected = true}, new SelectListItem { Text = "North" , Value = "North"}, new SelectListItem { Text = "East" , Value = "East"}, new SelectListItem { Text = "North East" , Value = "North East"}, new SelectListItem { Text = "West" , Value = "West"}, }; public static List<SelectListItem> GetBankRegionSelectList() { // 如果担心外部修改原始列表,可以返回副本,无需副本直接返回变量即可 // return new List<SelectListItem>(_bankRegionSelectList); return _bankRegionSelectList; } }
任意位置需要使用时,直接调用 CommonSelectProvider.GetBankRegionSelectList() 即可。
方案2:基控制器封装(适合多控制器需要复用大量公共逻辑的场景)
定义所有控制器的父类基控制器,把方法封装在基类中,子类控制器可直接调用:
public class BaseController : Controller { protected List<SelectListItem> BankSelectList() { return CommonSelectProvider.GetBankRegionSelectList(); } }
所有继承BaseController的业务控制器都可以直接在内部调用BankSelectList()方法。
方案3:单例服务注册(符合依赖注入规范的项目首选)
如果你的项目遵循依赖注入开发规范,可以将提供列表的服务注册为全局单例:
- 定义服务接口与实现
public interface ICommonSelectService { List<SelectListItem> GetBankRegionList(); } public class CommonSelectService : ICommonSelectService { private readonly List<SelectListItem> _bankRegionList = new() { // 列表内容同上 }; public List<SelectListItem> GetBankRegionList() => _bankRegionList; }
- 在
Program.cs(.NET Core)中注册单例:
builder.Services.AddSingleton<ICommonSelectService, CommonSelectService>();
- 控制器中通过构造函数注入服务后即可调用方法,性能和静态方案一致。
额外提示:你贴出的原始代码存在语法错误,方法内定义的列表变量名为
Region,但返回值是bank,运行会报错,记得修正。
内容的提问来源于stack exchange,提问作者Waller
相关产品推荐
相关产品推荐

