2013-01-12 66 views
4

我对MVC相当新,并想知道在我的编辑器模板中填充下拉的最佳方法?MVC4 DropDownListFor从数据库或代码枚举的最佳做法

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

下面是一个例子:

我的观点:

@{ 
     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; 
    } 

我见过的例子很多在这里,使节目制作选择列表在视图中静态。

最好的做法是在静态枚举的.net代码的视图中创建它们,还是最好现在就这样做呢?或者它只是无关紧要?

我只想知道我应该做什么,而不是什么正常工作。

回答

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) 
+0

好了,感谢您的SOLU灰。我想我唯一真正的问题是,我正在开发的应用程序有大约90多种不同的表单,这意味着我必须为每个表单编写自定义的Get()方法,而且它会有相当多的工作......等等。我知道从视图(或editortemplate)加载是错误的,但对于我来说有更少的代码,因为有些表单会共享模板。 –

+0

此外,我还有一个问题 - 如果我将EditorTemplate直接绑定到实体框架POCO模型 - 我现在已经为每个模型创建视图模型,然后通过我的控制器将它们实例化......如何更好地实现解?我看到的唯一优点是充分分离关注点。 –

+0

我看到的另一个问题 - 我现在必须反驳我的EF poco和模型实例之间的副本......恶作剧! –