这让我完全困惑。
这是我的观点:
@Html.DropDownListFor(model => model.ScoreDescription,
Model.RatingOptions,
"--",
new { @id = clientId })
型号:
public decimal? Score { get; set; }
public SelectList RatingOptions
{
get
{
var options = new List<SelectListItem>();
for (var i = 1; i <= 5; i++)
{
options.Add(new SelectListItem
{
Selected = Score.HasValue && Score.Value == Convert.ToDecimal(i),
Text = ((decimal)i).ToRatingDescription(ScoreFactorType),
Value = i.ToString()
});
}
var selectList = new SelectList(options, "Value", "Text");
// At this point, "options" has an item with "Selected" to true.
// Also, the underlying "MultiSelectList" also has it.
// Yet selectList.SelectedValue is null. WTF?
return selectList;
}
}
正如评论所暗示的那样,我无法让所选值发生。
这与我使用可为空的decimal
有关吗?在该循环之后,options
是正确的,因为它恰好有 1 个项目的 select 为 true,所以看来我正在做正确的事情。
现在,如果我使用不同 SelectList
重载:
var selectedValue = Score.HasValue ? Score.Value.ToString("0") : string.Empty;
var selectList = new SelectList(options, "Value", "Text", selectedValue);
它有效。为什么?起初我认为这可能是一个 LINQ 技巧(例如延迟执行),但我尝试强制 .ToList()
并且没有区别。
这就像在创建 SelectListItem
时设置 Selected
属性没有效果,而您在最后使用 SelectList
设置它> 向量参数。
有人能解释一下吗?
最佳答案
如果您查看 SelectList 类的实现,它实际上从未使用您传递 SelectListItem
的事实。它与 IEnumerable
一起使用。因此,不使用 SelectListItem
的 Selected
属性。就我个人而言,我更喜欢通过设置您将 ddl 绑定(bind)到的相应属性的值来设置下拉列表的选定值。
示例:
public int? Score { get; set; }
public SelectList RatingOptions
{
get
{
var options = Enumerable.Range(1, 5).Select(i => new SelectListItem
{
Text = ((decimal)i).ToRatingDescription(ScoreFactorType),
Value = ((decimal)i).ToString()
});
return new SelectList(options, "Value", "Text");
}
}
然后在 Controller 操作中只需将 Score
属性设置为必要的值,然后在 View 中使用此 Score 属性绑定(bind)到:
@Html.DropDownListFor(
model => model.Score,
Model.RatingOptions,
"--",
new { @id = clientId }
)
关于asp.net-mvc - DropDownListFor SelectedItem 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5892416/