【问题标题】:MVC4 best practice for DropDownListFor enum from database or code来自数据库或代码的 DropDownListFor 枚举的 MVC4 最佳实践
【发布时间】:2013-01-12 19:54:12
【问题描述】:

我是 MVC 的新手,想知道在我的编辑器模板中填充下拉列表的最佳方式吗?

我正在构建一个具有大量下拉列表的应用程序,并且这些下拉列表的数据是非常静态的。目前我将它们全部放在数据库中的一个表中,然后将它们加载到会话中。

这是一个例子:

我的看法:

   @{
        var widgettypes = Business.MySession.Current.WidgetTypes.ToSelectList(d => d.TypeName,
                                   d => d.WidgetTypeID.ToString(),
                                   " - Select - ");
    }
    <div class="editor-label">
        @Html.LabelFor(model => model.WidgetTypeID)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.WidgetTypeID, @widgettypes)
        @Html.ValidationMessageFor(model => model.WidgetTypeID)
    </div>

下拉助手:

    public static List<SelectListItem> ToSelectList<T>(
            this IEnumerable<T> enumerable,
            Func<T, string> text,
            Func<T, string> value,
            string defaultOption)
    {
        var items = enumerable.Select(f => new SelectListItem()
        {
            Text = text(f),
            Value = value(f)
        }).ToList();
        items.Insert(0, new SelectListItem()
        {
            Text = defaultOption,
            Value = "-1"
        });
        return items;
    }

我在 SO 上看到了很多示例,这些示例显示了在视图中静态创建选择列表。

最佳实践是从 .net 代码中的静态枚举的视图中创建它们,还是最好按照我现在的方式进行?或者它只是无关紧要?

我只想知道我应该做什么,而不是什么才有效。

【问题讨论】:

    标签: c# .net asp.net-mvc razor asp.net-mvc-4


    【解决方案1】:

    我个人认为数据库驱动是要走的路。主要是根据经验,假设您想在查找中添加一个值并且您已经部署了您的应用程序,您必须在将新值添加到 Enum 后重新部署代码。由于它们是数据库驱动的,您只需对数据库运行插入查询,无需重新部署。

    我不会在你的视图中那样调用你的数据库,我不会说这是最佳实践,因为这不是视图的责任,它只需要显示数据,而不是查询其他数据。

    首先,将您想要的项目放在模型的下拉列表中,如下所示:

    public class YourModel
    {
        public int WidgetTypeId { get; set; }
        public SelectList WidgetTypes { get; set; }
        //...rest of your model
    }
    

    然后,在控制器中的 GET 方法中(在返回视图之前,使用视图中的代码填充该列表:

    public ActionResult MyAction()
    {
        YourModel model = new YourModel();
    
        model.WidgetTypes = Business.MySession.Current.WidgetTypes
            .ToSelectList(d => d.TypeName, d => d.WidgetTypeID.ToString(), " - Select - ");
    
        return View(model);
    }
    

    那么在你看来,就这样做:

    @Html.DropDownListFor(model => model.WidgetTypeID, Model.WidgetTypes)
    

    【讨论】:

    • 好的,谢谢您的解决方案。我想我唯一真正的问题是我正在开发的应用程序有大约 90 多种不同的形式,这意味着我必须为每种形式编写自定义 Get() 方法,这将是相当多的工作......等等。我知道从视图(或编辑器模板)加载是错误的,但对我来说减少代码是一个更好的解决方案,因为某些表单将共享模板。
    • 另外,我还有另一个问题——如果我将我的 EditorTemplate 直接绑定到实体框架 POCO 模型怎么办——我现在不能为每个视图模型创建视图模型,然后在我的控制器中实例化它们。 ..这是一个更好的解决方案吗?我看到的唯一优势是完全分离关注点。
    • 我看到的另一个问题 - 我现在必须在我的 EF poco 和模型实例之间来回复制对象......呸!
    • 因为严格来说,您不应该真正将 POCO 作为模型公开,因为您必须创建视图模型,所以存在开销,但如果您遵循最佳实践,这是必要的开销。在理想的世界中,您的 Web 项目甚至不了解 EF 类,您的模型将位于核心层中,该层将与数据层(EF 层)和 Web 层对话,您的控制器调用方法在 Core 上填充并返回视图模型,Core 中的该方法反过来根据检索数据对象(如果需要)填充视图模型。
    • 不幸的是不是开源解决方案,只有我工作过的地方的专有工作。虽然,您现在使用的是真实示例:Stackoverflow 是在 ASP.NET MVC 中构建的 blog.stackoverflow.com/2008/09/… 请放心,尽管采用 MVC 方法可能会做更多的工作(这通常是因为很多东西都是为您完成的已经在 Web 表单中),最终产品将是一个更强大、更高效的解决方案。
    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2013-11-09
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多