DropDownListFor SelectedItem 的问题 [英] Problem with DropDownListFor SelectedItem
问题描述
这让我很困惑.
这是我的观点:
@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;
}
}
正如评论所暗示的那样,我无法实现选定的值.
As the comments suggest, i can't get the selected value to happen.
这与我使用可空 decimal
的事实有关吗?在那个循环之后,options
是正确的,因为它正好有 1 个 item 的 select 为 true,所以看起来我在做正确的事情.
Is it something to do with the fact i'm using a nullable decimal
? After that loop, options
is correct in that it has exactly 1 item with select to true, so it seems i'm doing the right thing.
现在,如果我使用不同的 SelectList
重载:
Now, if i use a different SelectList
overload:
var selectedValue = Score.HasValue ? Score.Value.ToString("0") : string.Empty;
var selectList = new SelectList(options, "Value", "Text", selectedValue);
它有效.为什么?起初我认为这可能是一个 LINQ 技巧(例如延迟执行),但我尝试强制使用 .ToList()
并且没有区别.
It works. Why? At first i thought it might be a LINQ-trick (e.g deferred execution), but i tried forcing a .ToList()
and there is no difference.
这就像在创建 SelectListItem
时设置 Selected
属性没有效果,并且您在最后使用 SelectList
设置它> ctor 参数.
It's like setting the Selected
property as you create the SelectListItem
has no effect, and you have you set it at the end using the SelectList
ctor parameter.
有人能解释一下吗?
推荐答案
如果您查看 SelectList 类的实现,它实际上从未使用过您正在传递 SelectListItem
的事实.它适用于 IEnumerable
.因此不使用 SelectListItem
的 Selected
属性.我个人更喜欢通过设置将 ddl 绑定到的相应属性的值来设置下拉列表的 selected 值.
If you look at the implementation of the SelectList class it never actually uses the fact that you are passing a SelectListItem
. It works with an IEnumerable
. So the Selected
property of a SelectListItem
is not used. Personally I prefer setting the selected value of a dropdown by setting the value of the corresponding property that you are binding the ddl to.
示例:
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");
}
}
然后在控制器操作中简单地将 Score
属性设置为必要的值,并在视图中使用此 Score 属性绑定到:
and then in the controller action simply set the Score
property to the necessary value and in the view use this Score property to bind to:
@Html.DropDownListFor(
model => model.Score,
Model.RatingOptions,
"--",
new { @id = clientId }
)
这篇关于DropDownListFor SelectedItem 的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!