MVC/C#: DropDownListFor 未选择 'selected' 项
MVC/C#: DropDownListFor not selecting 'selected' item
好的,我有一种情况需要 'BayTypes' 的多个 DDL 使用相同的字典,这不是问题。每个 'n' BayOptions 一个 DDL。我将字典作为 '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;" })
}
在 'result' 对象中选择了正确的项目。如果我单步执行并观察 'result',我可以看到 'Selected = true' 是正确的...但它在呈现时未在 DDLFor 中选择...
我错过了什么?
最终,决定下拉列表中 "selected" 项的是 ModelState
,而不是 SelectListItem.Selected
属性。 ModelState
由以下来源组成:Request
、ViewData
、ViewBag
,最后是 Model
.
检查 Request["BayTypes"]
、ViewData["BayTypes"]
、ViewBag.BayTypes
和 Model.BayTypes
的值。如果其中任何一个值与您期望 selected 的值不同,那就是您的问题,特别是如果该值甚至不在大致范围内。
例如,一个常见的原因是开发人员将他们实际的 select 列表选项存储在类似 ViewBag.Foo
的内容中,然后尝试将其应用于绑定到 Model.Foo
的下拉列表。此时 select 列表本身成为 ModelState
中的 selected 项目,而不是您 selected 的一个特定值。
解决了...更改为 .DropDownList(无 'For')并传入 'name' 作为先前创建的 'result' 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;" })
}
好的,我有一种情况需要 'BayTypes' 的多个 DDL 使用相同的字典,这不是问题。每个 'n' BayOptions 一个 DDL。我将字典作为 '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;" })
}
在 'result' 对象中选择了正确的项目。如果我单步执行并观察 'result',我可以看到 'Selected = true' 是正确的...但它在呈现时未在 DDLFor 中选择...
我错过了什么?
最终,决定下拉列表中 "selected" 项的是 ModelState
,而不是 SelectListItem.Selected
属性。 ModelState
由以下来源组成:Request
、ViewData
、ViewBag
,最后是 Model
.
检查 Request["BayTypes"]
、ViewData["BayTypes"]
、ViewBag.BayTypes
和 Model.BayTypes
的值。如果其中任何一个值与您期望 selected 的值不同,那就是您的问题,特别是如果该值甚至不在大致范围内。
例如,一个常见的原因是开发人员将他们实际的 select 列表选项存储在类似 ViewBag.Foo
的内容中,然后尝试将其应用于绑定到 Model.Foo
的下拉列表。此时 select 列表本身成为 ModelState
中的 selected 项目,而不是您 selected 的一个特定值。
解决了...更改为 .DropDownList(无 'For')并传入 'name' 作为先前创建的 'result' 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;" })
}