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

时间:2013-01-12 19:54:13

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

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

我正在构建一个具有大量下拉列表的应用程序,这些下拉列表的数据非常静态。目前我将它们全部放在db中的一个表中,然后将它们加载到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>

Dropdown Helper:

    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代码中的静态枚举中创建它们,还是最好按照我现在的方式进行?还是没关系?

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

1 个答案:

答案 0 :(得分:6)

我个人认为数据库驱动是要走的路。主要来自经验,假设您想在查找中添加一个值,并且您已经部署了应用程序,在将新值添加到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)