嗨,我想从模型中绑定MVC中的下拉列表。
这是我的模特
[Table("FileConfig")]
public class FileConfigModel
{
[Key]
[Display(Name = "File Congif ID")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FileConfigId { get; set; }
....
[Display(Name = "Description")]
public string Description { get; set; }
}
这是我在控制器中的getall方法:
public List<FileConfigModel> GetAll()
{
return db.FileConfigModels.ToList();
}
然后我从另一个控制器调用它
public ActionResult Create()
{
var fileConfigListEntries = new FileConfigController().GetAll()
.Select(fc => new SelectListItem
{
Value = fc.FileConfigId.ToString(),
Text = fc.Description,
Selected = false
});
ViewBag.FileConfigEntires = fileConfigListEntries;
return View();
}
以下是我的看法:
@Html.LabelFor(model => model.FileConfigId, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.FileConfigId, ViewBag.FileConfigEntires as SelectList, "-Select File Config")
@Html.ValidationMessageFor(model => model.FileConfigId)
</div>
但是,我一直在说错误
“没有类型'IEnumerable'的ViewData项具有键'FileConfigId'..”
有人可以帮助我,告诉我我错过了什么。
您对fileConfigListEntries
(即..Select(fc => new SelectListItem{ .. }
)的查询将返回IEnumerable<SelectListItem>
在视图中,您尝试使用SelectList
将其转换为typeof ViewBag.FileConfigEntires as SelectList
SelectList
是IEnumerable<SelectListItem>
,但IEnumerable<SelectListItem>
不是SelectList
,因此转换失败,DropDownListFor()
的第二个参数是null
。当第二个参数是null
时,该方法期望第一个参数是IEnumerable<SelectListItem>
,它不是,因此是例外。
将您的代码更改为
@Html.DropDownListFor(m => m.FileConfigId, ViewBag.FileConfigEntires as IEnumerable<SelectListItem>, ... )
要么
@Html.DropDownListFor(model => model.FileConfigId, (IEnumerable<SelectListItem>)ViewBag.FileConfigEntires, ... )
旁注在Selected = false
子句中没有设置.Select
- 默认情况下它的false
,但在任何情况下,它在绑定到模型属性时被忽略(它的属性值决定了所选的内容)
上述错误的可能原因可能是变量fileConfigListEntries为null或者没有从dbcontext获取数据。由于下拉列表以null或集合为界,没有元素错误,因为“没有类型'IEnumerable'的ViewData项具有密钥'FileConfigId'..”我建议用硬编码数据替换fileConfigListEntries视图包数据看错误就消失了。