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

时间:2017-03-25 06:48:21

标签: 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);
}

根据以下图片正确填充数据

enter image description here

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

并查看模型

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; }
        ....
    }

查看如下

....
@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" />
}

3 个答案:

答案 0 :(得分:3)

由于视图中的以下代码行而发生错误

select b.id, b.title, b.content, b.reply, sum(v.vote)
from board b 
left join vote on b.id = v.id 
group by b.id, b.title, b.content, b.reply

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

@Html.HiddenFor(model => model.Companies)

当您提交表单时,<input ... name="Companies" value="System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]" />` 会尝试将属性DefaultModelBinder绑定到该值并失败(您无法将Companies的属性绑定到IEnumerable<SelectListItem>

删除该行代码。如果由于其他原因导致string无效,则需要返回视图,然后在返回视图之前重新填充SelectLists。

答案 1 :(得分:0)

我已通过删除{get;设置;}来自SelectListItem属性

public IEnumerable<SelectListItem> Companies { get; set; }

替换为

public IEnumerable<SelectListItem> Companies

答案 2 :(得分:0)

更改输入名称。

useEffect(() => {
  getAllEmailsFromConfirmedUsers(setMyState);
});