【问题标题】:Best way to populate ViewData for DropDownLists in Asp.net mvc?在 Asp.net mvc 中为 DropDownLists 填充 ViewData 的最佳方法?
【发布时间】:2010-02-14 16:25:25
【问题描述】:

为多个视图中使用的下拉列表填充 ViewData 的最佳方法是什么。如果在每个使用下拉菜单的操作中都这样做,那么我们就违反了 DRY 原则。理想情况下,我们应该缓存经常使用的 SelectList(例如国家、州等)。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我以前用 ActionFilters 做过。就我而言,我需要在每个页面上列出赞助商列表。

    http://weblogs.asp.net/psteele/archive/2009/11/04/using-windsor-to-inject-dependencies-into-asp-net-mvc-actionfilters.aspx

    【讨论】:

    • 虽然它是一个干净的解决方案,但我有太多常见的 SelectLists。我不想创建 5 个不同的过滤器。有没有比过滤器更好的方法。
    • “更好”是一个相对术语。通过创建 5 个不同的过滤器,您可以在决定哪些操作和控制器需要 ViewData 中的特定数据集时拥有最大的灵活性。实际上,您可能可以创建一个过滤器来接受一些参数(可能是枚举列表),这些参数将指示需要将哪些下拉数据放入视图数据中。我不像单独的过滤器那样喜欢它,但它会让你得到一个过滤器。
    • @Patrick Steele 问题是属性空间在 ASP.NET MVC 中非常宝贵,如果不小心,您最终会得到比控制器中的代码行更多的属性。
    • @jfar:同意,我可以看到发生这种情况的可能性。但这有问题吗?如果我看到将更多属性应用于代码行的方法,这对我来说肯定会很奇怪,但我不确定我是否会立即将其等同于“坏事”。老实说,我没有考虑那么多。有趣...
    • @Patrick Steele 你的权利不是问题也不是坏事,我没有说或暗示。我只是想分享我的,我认为阿弥陀佛的担忧。也许这只是我的一个迂腐怪癖,MVC 几乎鼓励拥有大量属性。实际上,它可以被认为是一件好事,因为它有助于分离关注点。
    【解决方案2】:

    您应该为这些视图准备基本视图模型,并通过继承特定视图的数据来增强它:

    class BaseViewModel
    {
         List<string> Countries;
         List<string> States;
    }
    

    在我的应用程序中,我创建了一个包含缓存字典的对象。它实现了 IApplicationCache 接口(由我创建,它返回使用过的字典列表),该接口被注入到业务逻辑层并用于填充视图模型。

    【讨论】:

    • 但是我们仍然需要在每个使用 Select 列表的操作中重复填充逻辑。
    • @Amitabh:您可以在视图模型构造函数中填充它或定义执行此操作的外部方法并仅调用该方法。
    • 如果我在 Templated Html Helper 中使用 DropDownList 作为 UIHint,这将如何工作?
    • @Amitabh:我对 UIHintAttribute 了解不多,您必须检查是否可以将模型的一部分传递给负责显示下拉列表的视图。我会试着检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2017-01-01
    • 1970-01-01
    • 2020-01-08
    相关资源
    最近更新 更多