DropDownListFor SelectedItem 的问题 [英] Problem with DropDownListFor SelectedItem

查看:17
本文介绍了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.因此不使用 SelectListItemSelected 属性.我个人更喜欢通过设置将 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆