如何在编辑视图中显示DropDownList,并从DataBase中选择一个值

时间:2012-10-09 08:48:54

标签: asp.net-mvc asp.net-mvc-3 razor

我在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()
            });

1 个答案:

答案 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,因为它的值从未发送过。因此,如果您打算重新显示相同的视图,则需要初始化此属性,因为您的视图取决于它。