c# - 来自数据库或代码的 DropDownListFor 枚举的 MVC4 最佳实践

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

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

我正在构建一个有很多下拉菜单的应用程序,这些下拉菜单的数据非常静态。目前我将它们全部放在数据库的一个表中,然后将它们加载到 session 中。

这是一个例子:

我的看法:

   @{
        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 上看到了很多示例,这些示例显示了在 View 中静态创建选择列表。

最佳做法是在 .net 代码中从静态枚举的 View 中创建它们,还是最好按照我现在的方式来创建它们?或者它只是无关紧要?

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

最佳答案

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

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

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

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

然后,在 Controller 的 GET 方法中(在返回 View 之前,用 View 中的代码填充该列表:

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)

关于c# - 来自数据库或代码的 DropDownListFor 枚举的 MVC4 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297334/

相关文章:

c# - 集合上的表达式树 'Any'

C# DataGridViewComboBoxColumn绑定(bind)问题

c# - 在代码分析器中运行 C# 应用程序与在外部代码分析器中运行有何不同?

c# - 使用 .NET 生成 HTML 电子邮件

c# - ASP.NET MVC3 Razor : Redirecting from Partial Views

asp.net-mvc - 没有为此对象定义无参数构造函数?

asp.net-mvc - SignalR 客户端在每次刷新页面时断开/连接。 ASP.NET MVC

c# - 如何使应用程序中的路径相对,我在哪里做? (MVC4)

c# - 从 Directory.GetFiles 中排除结果

c# - 从 System.IO.Abstractions 中抛出 UnauthorizedAccessException