从类型“System.String”到类型“System.Web.Mvc.SelectListItem”的参数转换失败

Mah*_*344 2 c# asp.net-mvc asp.net-mvc-4

我的 MVC 应用程序出现错误。我有一个页面,其中有一些文本字段和一个下拉菜单。当我提交页面时,数据正确加载到该页面,ModelState返回错误

从类型“System.String”到类型“System.Web.Mvc.SelectListItem”的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。

控制器方法

public ActionResult Edit(string id)
{
    ....
    EditUserViewModel vm = new EditUserViewModel()
    .... // populate the view model including its SelectList properties
    return View(vm);
}
Run Code Online (Sandbox Code Playgroud)

数据已正确填充,如下图所示

在此输入图像描述

但是当它提交回控制器时,模型状态无效并给出错误。

并查看模型

public class EditUserViewModel
{
        public string UserID { get; set; }
        public string SelectedRoleName { get; set; }
        public IEnumerable<SelectListItem> Roles { get; set; }
        public string SelectedCompanyID { get; set; }
        public IEnumerable<SelectListItem> Companies { get; set; }
        ....
    }
Run Code Online (Sandbox Code Playgroud)

视图如下

....
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.HiddenFor(model => model.UserID)
    @Html.DropDownListFor(model => model.SelectedRoleName, Model.Roles)
    @Html.DropDownListFor(model => model.SelectedCompanyID, Model.Companies, 
    @Html.HiddenFor(model => model.Companies)
    ....

    <input type="submit" value="Save" class="btn btn-default" />
}
Run Code Online (Sandbox Code Playgroud)

小智 5

发生错误是因为视图中的以下代码行

@Html.HiddenFor(model => model.Companies)
Run Code Online (Sandbox Code Playgroud)

如果你检查它生成的 html,它将是

<input ... name="Companies" value="System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]" />`
Run Code Online (Sandbox Code Playgroud)

当您提交表单时,DefaultModelBinder尝试将属性绑定Companies到该值并失败(您不能将属性绑定IEnumerable<SelectListItem>到 a string)。

删除该行代码。如果您需要返回视图,因为由于ModelState其他原因无效,请在返回视图之前重新填充 SelectList。