2012-02-14 45 views
1

我想制定一个最佳实践,用于构建需要绑定到数据库中值的值的下拉框。Web框架下拉框(ASP.NET MVC/ROR /任何东西)的最佳实践

目前我将使用第3个答案从这个名单How do you create a dropdownlist from an enum in ASP.NET MVC?

但后来我想,如果我对枚举强烈地结合,然后想改变项目的顺序,或添加新项目,我需要确保枚举的顺序实际上并不是存储在数据库中的值,并且必须具有某种绑定层。

有没有人有与db有关的下拉列表工作的权威性方法?

+0

旁注 - 如果你想链接到一个特定的答案,点击它下面的“链接”按钮来永久保存它 – RPM1984 2012-02-14 02:02:16

回答

0

为列表提供强类型视图模型,并使用局部视图进行匹配。在控制器中执行操作,该控制器填充视图模型,然后将其返回到视图。无论您想要使用下拉列表,都可以在视图中插入部分视图。

0

我使用的扩展方法用于这个任务的粉丝:

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

    if (!string.IsNullOrEmpty(defaultOption)) 
    { 
        items.Insert(0, new SelectListItem() 
         { 
          Text = defaultOption, 
          Value = "-1" 
         }); 
    } 

    return items; 
} 

在你的控制器,你选择你wan't表示作为一个下拉中项目的数据。注意,在这个例子中,我从数据库中选择城市:

SomeModel.City = 
     (from l in _locationRepository.GetAll() select new { l.Area.AreaDescription }) 
      .Distinct() 
      .ToSelectList(x => x.AreaDescription, x => x.AreaDescription, "All"); 

和实际降视图内上下:

@Html.DropDownList("City", Model.City) 
1

个人而言,我避免在我看来机型采用枚举。他们不擅长ASP.NET MVC。所以,如果我需要呈现在我的观点一个一个下拉列表,我在我的相应的视图模型中定义了2个属性:

public class MyViewModel 
{ 
    public string SelectedValue { get; set; } 
    public IEnumerable<SelectListItem> Values { get; set; } 
} 

了在我的控制器操作填充从数据库和视图:

@Html.DropDownListFor(x => x.SelectedValue, Model.Values) 
+0

我希望+>应该=>或者我肯定错过了linq语法中的一些东西! – 2012-02-14 09:03:42

+0

我试图修复拼写错误,但出现以下错误编辑必须至少包含6个字符;在这篇文章中还有其他改进之处吗? – RickAndMSFT 2012-02-14 19:46:11

+0

@ Rick.Anderson-at-Microsoft.com,我修复了错字。感谢您的注意。 – 2012-02-14 19:52:08