我在ASP.Net中使用MVC 3我的Web应用程序是使用ViewModel和ViewModel builder设计的。
我使用Builder类填充ViewModel中的一些数据。在我的情况下,我有一个创建视图DropDownList,这个代码工作正常。我的问题是在尝试创建编辑视图时,我收到此错误:
{"The ViewData item that has the key 'CandidateId' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'."}
我的想法是用一些值填充DropDownList,但是已经预先选择了一个数据库记录。
那么如何在编辑视图中显示DropDownList并从数据库中选择一个值?
查看
<div class="editor-label">
@Html.LabelFor(model => model.CandidateId)
</div>
<div class="editor-field">
@Html.DropDownListFor(x => x.CandidateId, Model.CandidatesList, "None")
</div>
查看模型
public Nullable<int> CandidateId { get; set; }
public IEnumerable<SelectListItem> CandidatesList;
查看模型构建器
// We are creating the SelectListItem to be added to the ViewModel
eventEditVM.CandidatesList = serviceCandidate.GetCandidates().Select(x => new SelectListItem
{
Text = x.Nominative,
Value = x.CandidateId.ToString()
});
答案 0 :(得分:1)
出现此错误的原因是,在您的[HttpPost]
操作中,您忘记从数据库中重新填充视图模型上的CandidatesList
属性。
[HttpPost]
public ActionResult Edit(EventEditVM model)
{
if (ModelState.IsValid)
{
// the model is valid => do some processing here and redirect
// you don't need to repopulate the CandidatesList property in
// this case because we are redirecting away
return RedirectToAction("Success");
}
// there was a validation error =>
// we need to repopulate the `CandidatesList` property on the view model
// the same way we did in the GET action before passing this model
// back to the view
model.CandidatesList = serviceCandidate
.GetCandidates()
.Select(x => new SelectListItem
{
Text = x.Nominative,
Value = x.CandidateId.ToString()
});
return View(model);
}
不要忘记,在提交表单时,只会将下拉列表的选定值发送到服务器。 POST控制器操作中的CandidatesList
集合属性将为null,因为它的值从未发送过。因此,如果您打算重新显示相同的视图,则需要初始化此属性,因为您的视图取决于它。