这完全让我感到困惑。
这是我的观点:
@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;
}
}
正如评论所暗示的,我无法让选定的值发生。
这与我使用 nullable 的事实有关decimal
吗?在那个循环之后,options
它是正确的,因为它恰好有 1 个选择为 true 的项目,所以看来我在做正确的事情。
现在,如果我使用不同 SelectList
的重载:
var selectedValue = Score.HasValue ? Score.Value.ToString("0") : string.Empty;
var selectList = new SelectList(options, "Value", "Text", selectedValue);
有用。为什么?起初我认为这可能是一个 LINQ 技巧(例如延迟执行),但我尝试强制 a.ToList()
并且没有区别。
这就像在Selected
创建时设置属性SelectListItem
没有效果,并且您在最后使用SelectList
ctor 参数设置它。
任何人都可以对此有所了解吗?