MVC / C#:DropDownList没有选择'选择'项目

时间:2015-07-09 16:07:50

标签: c# asp.net-mvc dictionary html.dropdownlistfor selectlistitem

好吧,我的情况是我需要有多个“BayTypes'”的DDL。使用相同的字典,这不是一个问题。一个DDL用于每个' n' BayOptions。我将字典传递给了我的视图,因为BayTypes'像这样:

(控制器)

var bayTypes = _bayTypeRepository.GetBayTypes().ToList();
property.BayTypes = bayTypes.ToDictionary(g => g.Name, g => g.BayTypeGuid.ToString());

(查看)

var overrideValue = item.BayTypeOverride ? item.BayTypeOverrideValue.BayTypeGuid.ToString() : string.Empty;
var result = (from x in Model.BayTypes
              select new SelectListItem()
                  {
                  Text = x.Key,
                  Value = x.Value,
                  Selected = x.Value == overrideValue <-- ***this is working***
                  });
if (item.BayTypeOverride == true)
    {
     @Html.DropDownListFor(x => x.BayTypes, result, new { @Name = "BayOptionsToSubmit[" + aCounter + "].BayTypeOverrideValue" })
    }
    else
    {
     @Html.DropDownListFor(x => x.BayTypes, result, new { @Name = "BayOptionsToSubmit[" + aCounter + "].BayTypeOverrideValue", @style = "display:none;" })
    }

在&#39;结果&#39;中选择了正确的项目?宾语。如果我单步执行,并观察结果,我可以看到&#39;选择=真&#39;对于正确的...但它在渲染时没有在DDLFor中选择...

我错过了什么?

2 个答案:

答案 0 :(得分:2)

最终,确定下拉列表中“已选定”项目的因素是ModelState,而不是SelectListItem.Selected属性。 ModelState由以下来源组成:RequestViewDataViewBag,最后是Model

检查Request["BayTypes"]ViewData["BayTypes"]ViewBag.BayTypesModel.BayTypes的值。如果其中任何一个具有与您期望选择的值不同的值,那就是您的问题,特别是如果该值甚至不在球场中。

例如,一个常见原因是开发人员将其实际选择列表选项存储在ViewBag.Foo之类的内容中,然后尝试将其应用于绑定到Model.Foo的下拉列表。此时的选择列表本身将成为ModelState中的所选项目,而不是您选择的一个特定值。

答案 1 :(得分:0)

解决了它...改为.DropDownList(没有&#39; For&#39;)并传入了&#39;名称&#39;作为结果&#39; var之前创建的。的工作原理。

var overrideValue = item.BayTypeOverride ? item.BayTypeOverrideValue.BayTypeGuid.ToString() : string.Empty;
var result = (from x in Model.BayTypes
              select new SelectListItem()
              {
                Text = x.Key,
                Value = x.Value,
                Selected = x.Value == overrideValue
               });
               if (item.BayTypeOverride)
               {
                @Html.DropDownList("result", result, htmlAttributes: new { @Name = "BayOptionsToSubmit[" + aCounter + "].BayTypeOverrideValue" })
               }
               else
               {
                @Html.DropDownList("result", result, htmlAttributes: new { @Name = "BayOptionsToSubmit[" + aCounter + "].BayTypeOverrideValue", @style = "display:none;" })
                                }