我正在使用一个调用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项)。视觉和实现显示出两种不同的东西,令人困惑。
答案 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个参数(由于强类型帮助程序的目的是绑定模型值,因此没有必要)