DropDownListFor SelectList SelectedValue未被识别

时间:2014-12-01 14:24:26

标签: asp.net-mvc

我正在使用一个调用HtmlHelper.DropDownListFor()的简单示例,并且传递的SelectList对象具有构造函数中指示的默认值:

SelectList MySelectList = new SelectList(MyCollection, "ValueField", "TextField", DefaultIdValue);

然后将此SelectList对象传递到我的视图模型中,形成强类型视图。

如果我在@Html.DropDownListFor()调用中断,我可以看到传入SelectList方法调用的DropDownListFor()对象确实将正确的SelectedValue属性设置为正确值字段值。即使通过枚举选择列表项,我也可以看到正确的项已将Selected设置为true。然而,当这实际上最初未选择此选定值时,它仍然只是下拉列表框中的第一个项目。

我在这里做错了什么?我已经完成了所有对象验证,但此SelectedValue似乎不是“已识别”。提前感谢您的帮助!

修改

这是我的模型(它是一个传递给强类型视图的视图模型)

public class MyViewModel
{
    public IEnumerable<MyClass> MyClasses { get; set; }
    public SelectList MyClassList { get; set; }

    public int SelectedId { get; set; }
    public int PreSelectedId { get; set; }
}

然后我有逻辑在将视图模型推送到视图之前确定操作中的PreSelectedId

        PreSelectedId = // code to get preselected id.  Debugged and working

        SelectList TempList = new SelectList(MyCollectionOfObj, "Id", "TextField", PreSelectedId);

        return View(
            new MyViewModel()
            {
                MyClassList = TempList,
                MyClasses = // retrieves some objects here,
                PreSelectedId = PreSelectedId
            });

实际选择的值 visual 是第一个元素。通过打破代码并查看SelectList.SelectedValue的实际选择值是正确的值(例如,第5项)。视觉和实现显示出两种不同的东西,令人困惑。

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试绑定到属性SelectedId,如

@Html.DropDownListFor(m => m.SelectedId, Model.ClassList)

由于SelectedId的值为0(您似乎没有在任何地方设置),帮助程序会尝试查找值为0的选项,但它无法,因此显示第一个选项(它必须显示某些内容),这就是为什么你经常使用@Html.DropDownListFor()的重载来添加"--Please select--"标签,该标签的值为null

将代码更改为

return View(new MyViewModel()
{
  MyClassList = TempList,
  MyClasses = // retrieves some objects here,
  SelectedId = PreSelectedId // change this
});

并从SelectList构造函数中删除第4个参数(由于强类型帮助程序的目的是绑定模型值,因此没有必要)