0
SelectList dropdown = DropDown;
foreach (var item in dropdown)
    {
     var modelValue = property.GetValue(Model.FormModel);
     if (String.Equals(item.Value, modelValue))
              {
                   item.Selected = true;
                   System.Diagnostics.Debug.WriteLine(item.Selected);
               }
     }

foreach (var item in dropdown)
      {
       var modelValue = property.GetValue(Model.FormModel);
       if (String.Equals(item.Value, modelValue))
             {
                    System.Diagnostics.Debug.WriteLine(item.Selected);
              }
       }

从逻辑上讲,上面的代码应该不输出任何内容,或者true, true除非魔法磁场在计算机中的一个 foreach 循环和另一个循环之间改变位。

然而,我明白了true, false。这怎么可能?使用调试器,我看到“项目”被正确解析并item.Selected = true在我想要的项目上被正确调用。第二个循环仅用于调试目的。


这就是我构建 DropDown 的方式。我无法触摸此代码,因为返回的下拉列表应该始终是通用的。

var prov = (from country in Service.GetCountries()
         select new
          {
           Id = country.Id.ToString(),
           CountryName = Localizator.CountryNames[(CountryCodes)Enum.Parse(typeof(CountryCodes), country.Code)],
           }).Distinct().ToList().OrderBy(l => l.CountryName).ToList();
           prov.Insert(0, new { Id = String.Empty, CountryName = Localizator.Messages[MessageIndex.LabelSelectAll] });
  _customerCountrySelectionList = new SelectList(prov, "Id", "CountryName");
4

2 回答 2

2

如果您使用 foreach 遍历集合,则无法修改其内容。因此第二次迭代将访问相同的未修改列表...

使用 Linq 直接创建“SelectListItems”列表,然后将该列表分配给 dropdownhelper

from x in y where ... select new SelectListItem { value = ..., text = ..., selected = ... }

使用您的代码...您可能想要创建类似的东西

var modelValue = property.GetValue(Model.FormModel);
IEnumerable<SelectListItem> itemslist = 
         (from country in Service.GetCountries()
          select new SelectListItem {
          {
            value = country.Id.ToString(),
            text  = Localizator
                      .CountryNames[
                          (CountryCodes)Enum
                                         .Parse(typeof(CountryCodes),
                          country.Code)
                       ],
            selected = country.Id.ToString().Equals(modelValue)
           }).Distinct().ToList().OrderBy(l => l.text);

...虽然还没有在 VS 中测试过,所以请尝试一下,看看你是否可以让它工作

于 2013-07-30T09:35:38.490 回答
0

item.Selected = true; 在第一个循环中设置为 true。

于 2013-07-30T09:27:32.090 回答