【问题标题】:Best practice for drop down boxes for web framework (ASP.NET MVC / ROR / Anything really)Web 框架下拉框的最佳实践(ASP.NET MVC / ROR / 真的)
【发布时间】:2012-02-14 00:47:12
【问题描述】:

我正在尝试制定一个最佳实践,为需要绑定到数据库中的值的值构建下拉框。

目前我即将使用此列表中的第三个答案How do you create a dropdownlist from an enum in ASP.NET MVC?

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

有没有人有明确的方法来处理与数据库相关的下拉列表?

【问题讨论】:

  • 附注 - 如果您想链接到特定答案,请单击其下方的“链接”按钮以永久链接到它

标签: asp.net-mvc enums drop-down-menu


【解决方案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)

【讨论】:

  • 我希望 +> 应该是 => 否则我肯定错过了 linq 语法中的某些内容!
  • 我试图修正错字但得到以下错误 Edits must be at least 6 characters;这篇文章还有什么需要改进的地方吗?
  • @Rick.Anderson-at-Microsoft.com,我已经修正了错字。感谢您的关注。
【解决方案2】:

为列表提供一个强类型视图模型,并匹配部分视图。在控制器中有一个动作填充视图模型,然后将其返回给视图。无论您想在哪里使用下拉菜单,都可以在视图中插入局部视图。

【讨论】:

    【解决方案3】:

    我喜欢使用扩展方法来完成这项任务:

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

    在您的控制器中,您可以在下拉菜单中选择您不想表示为项目的数据。注意,在这个例子中,我从数据库中选择城市:

        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)
    

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多