【问题标题】:ASP.NET MVC - Populate Commonly Used DropdownlistsASP.NET MVC - 填充常用下拉列表
【发布时间】:2026-02-01 07:45:02
【问题描述】:

我想知道在 ASP.NET MVC 中填充常用下拉列表时的最佳做法是什么。例如,我有一个 Country and State 选择,在我的应用程序中经常使用。对于我想要包含这样一个下拉列表的每个视图,填充视图模型并从我的控制器绑定到该视图模型似乎很脏。

在这种情况下,人们如何填充他们的下拉列表? - 包含这个的自定义基类?辅助类等?

提前致谢,

日本

【问题讨论】:

    标签: c# asp.net-mvc drop-down-menu


    【解决方案1】:

    您可以拥有一个RequiresStateList 属性来将该通用功能注入到需要它的操作中。

    public class RequiresStateList : ActionFilterAttribute {
        public override void OnResultExecuting(ResultExecutingContext filterContext) 
        {
            filterContext.Controller.ViewData["StateList"] = GetStates();
        }
    }
    

    还有你的行动

    [RequiresStateList]
    public ActionResult Index() {
        return View();
    }
    

    现在您可以从视图中的 ViewData 获取该列表。

    【讨论】:

    • 不知道为什么我没有想到这个 - 一个优雅且可重用的解决方案。谢谢!
    • 开个玩笑,我声明这违反了 Thunderdome 原则!
    • 很好的解决方案。我第一次意识到你可以制作自定义属性
    【解决方案2】:

    自定义 HTML 助手是可行的方法...

    http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs

    【讨论】:

    • 非常优雅:模型和视图都不臃肿。视图中的 code 优雅且可重用。 HtmlHelper 可以单独进行单元测试。
    • 我喜欢这个解决方案,而不是把它们放在模型中。我更喜欢将我的模型保留在正在填充/提交的数据中,在这种情况下,这将是选定的值——而不是完整的值列表。这些也很方便,允许您的视图模板获取 DispalyFor 模板的选定值的 Text 属性(即获取值属性与选定值匹配的 Text 属性)。
    • 使用 DAL 扩展 HTML 助手会破坏 MVC 架构,因为您将让视图调用数据层,而不是只是一个虚拟的。虽然打破 MVC 架构不一定是坏事。
    【解决方案3】:

    我非常喜欢创建与每个视图完全匹配(模型)的视图模型。因此,如果您有一个带有 States 下拉列表的视图,我的该页面的视图模型将具有 ListItems 的 States 集合。

    我不会担心视图模型上带有状态集合。相反,我会集中逻辑来获取状态,例如:

    viewModel.States = StatesHelper.GetStates(); // returns IList<ListItem>
    

    【讨论】: