DropDownListFor未在视图中获取所选项目,但在viewmodel中

时间:2011-08-30 14:37:08

标签: c# asp.net-mvc-3 razor drop-down-menu html-helper

我在我的视图中使用了一个下拉列表帮助器:

 @Html.DropDownListFor(m => m.BasePlayerForm.Position, Model.GetPositions())

我在模型中有一个填充列表的函数:

 public IEnumerable<SelectListItem> GetPositions()
    {
        foreach (string positionValue in Enum.GetNames(typeof(PlayerPosition)))
        {
            var selectListItem = new SelectListItem();
            selectListItem.Text = positionValue;
            selectListItem.Value = ((int)Enum.Parse(typeof(PlayerPosition), positionValue)).ToString();
            if (BasePlayerForm.Position.ToString() == positionValue)
                selectListItem.Selected = true;

            yield return selectListItem;
        }
    }

(我知道还有一个更短的版本,返回一个列表项,但出于调试目的,我发现这更有用。)有趣的是,如果我在“selectListItem.Selected = true”处设置一个制动点;行,调试器命中它,但是当我渲染视图时,没有选择任何选项。我也在我的视图中使用另一个dropdownlist for helper以相同的方式填充下拉列表,但是那个获取选定的项目。我真的不知道它的问题是什么。如果有人知道请告诉我,我会非常感激=)

2 个答案:

答案 0 :(得分:2)

当使用以IEnumerable的SelectListItem作为参数的强类型Html Helpers时,将忽略这些项的selected属性。

当您在GetPositions()方法中设置SelectListItem的值时,您将PlayerPosition枚举转换为int。我假设视图模型中的BasePlayerForm.Position属性不是int。如果将BasePlayerForm.Position更改为int,则应根据该属性设置所选项目。

答案 1 :(得分:0)

您可以在属性中使用该代码而不是使用函数:

public IEnumerable<SelectListItem> ChangeMyName {  
get {  
foreach (string positionValue in Enum.GetNames(typeof(PlayerPosition)))
    {
        var selectListItem = new SelectListItem();
        selectListItem.Text = positionValue;
        selectListItem.Value = ((int)Enum.Parse(typeof(PlayerPosition), positionValue)).ToString();
        if (BasePlayerForm.Position.ToString() == positionValue)
            selectListItem.Selected = true;

        ChangeMyName.Add(selectListItem);
    }
set{return;}  
}  

然后,您可以这样称呼它:

@Html.DropDownListFor(m => m.BasePlayerForm.Position,new SelectList( Model.GetPositions)  

我不确定这是否有帮助,但这将是我会尝试的。