[asp.net-mvc]dropdownlistfor 不选择选定页面加载后是什么

发布时间: 2017/3/25 18:08:23
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有此帮助器。现在,这不是我的。这是用于显示和填充下拉列表。

public static IEnumerable<SelectListItem> ToSelectList<T, TTextProperty, TValueProperty>(this IEnumerable<T> instance, Func<T, TTextProperty> text, Func<T, TValueProperty> value, Func<T, bool> selectedItem = null)
        {
            return instance.Select(t => new SelectListItem
            {
                Text = Convert.ToString(text(t)),
                Value = Convert.ToString(value(t)),
                Selected = selectedItem != null && selectedItem(t)
            });
        }

然后这些人上课︰

public class FooVm {
  public FooVm() {
    Bars = new HashSet<BarVm>();
  }

  public int FooId { get; set; }
  public IEnumerable<BarVm> Bars { get; set; }
}

public class BarVm {
  public int BarId { get; set; }
  public int BarName { get; set; }
}

然后有此 Linq 查询︰

var fooBar = _db.Foo
                .WithId(fooId)
                .Select(f => new FooVm {
                  FooId = f.Id,
                  Bars = f.Bars.Select(b => new BarVm {
                    BarId = b.Id,
                    BarName = b.Name
                  })
                })
                .ToList();

ViewBag.Bars = _db.Bars
                  .ToSelectList(s => s.Name, s => s.Id);

然后当我试着来呈现这些编辑/更新的结果。

@model ViewModels.Foo.FooVm

@Html.LabelFor(model => model.FooId)
@foreach(var item in Model.Bars) {
  @Html.DropDownListFor(model => item.BarId, ViewBag.Bars as IEnumerable<SelectListItem>, "Select bar")
}

下拉列表中呈现细,但它不选择的选择在页面加载时是什么。

我错过了什么?任何帮助,将不胜感谢。谢谢你

解决方法 1:

你帮助器方法采用达 3 参数但仅提供两个。第三个参数允许您将选定的项设置默认情况下这将是 '空'。例如见下文。

ViewBag.Bars = Model.Bars.ToSelectList(s => s.BarName, s => s.BarId, s => s.BarId == 1);

编辑

试试这个,但是因为我不了解你的前提或你想实现这一目标只是指导你。

public static MvcHtmlString DropDownListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression,
                                               IEnumerable<SelectListItem> selectList, string selectedValue, string optionLabel, object htmlAttributes)
    {
        Func<TModel, TValue> method = expression.Compile();
        string value = method(helper.ViewData.Model) as string;

        if (string.IsNullOrEmpty(value) && selectList != null)
        {
            var selectListList = selectList.ToList();
            var selectedItem = selectListList.FirstOrDefault(s => s.Selected);
            if (selectedItem == null)
            {
                var itemToSelect = selectListList.FirstOrDefault(w => w.Value == selectedValue);
                if (itemToSelect != null)
                {
                    itemToSelect.Selected = true;
                }
            }
            return helper.DropDownListFor(expression, selectListList, optionLabel, htmlAttributes);
        }

        return helper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
    }

像这样使用。

@Html.DropDownListFor(model => item, ViewBag.Bars as IEnumerable<SelectListItem>, item.BarId.ToString(), "Select bar", new object())

这彻底测试,这是只是快速的原型,来展示你如何可以帮助您创建的自己。

选定的值可以重写,如果你使用第一个答案是 Selected 属性的 SelectListItem 将是 true

赞助商