C# 从类型';System.String';输入';System.Web.Mvc.SelectListItem';失败

C# 从类型';System.String';输入';System.Web.Mvc.SelectListItem';失败,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我的MVC应用程序出现错误。我有一个页面,其中有一些文本字段和一个下拉列表。当我提交页面时,ModelState返回错误信息,数据正确加载到该页面 从类型“System.String”到类型“System.Web.Mvc.SelectListItem”的参数转换失败,因为没有类型转换器可以在这些类型之间转换 控制器方法 public ActionResult Edit(string id) { .... EditUserViewModel vm = new EditUserVie

我的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);
}
按照下图正确填充数据

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

和视图模型

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; }
        ....
    }
public类EditUserViewModel
{
公共字符串用户标识{get;set;}
公共字符串SelectedRoleName{get;set;}
公共IEnumerable角色{get;set;}
公共字符串SelectedCompanyID{get;set;}
公共IEnumerable公司{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" />
}
。。。。
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model=>model.UserID)
@Html.DropDownListFor(model=>model.SelectedRoleName,model.Roles)
@Html.DropDownListFor(model=>model.SelectedCompanyID,model.companys,
@Html.HiddenFor(model=>model.companys)
....
}

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

@Html.HiddenFor(model => model.Companies)
如果您检查它正在生成的html,它将

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


删除该行代码。如果因为
ModelState
因其他原因无效而需要返回视图,请在返回视图之前重新填充选择列表。

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

@Html.HiddenFor(model => model.Companies)
如果您检查它正在生成的html,它将

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


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

我已通过从SelectListItem属性中删除{get;set;}解决了此错误

public IEnumerable<SelectListItem> Companies { get; set; }
public IEnumerable公司{get;set;}
替换为

public IEnumerable<SelectListItem> Companies
上市公司

我已通过从SelectListItem属性中删除{get;set;}解决了此错误

public IEnumerable<SelectListItem> Companies { get; set; }
public IEnumerable公司{get;set;}
替换为

public IEnumerable<SelectListItem> Companies
上市公司
更改输入名称

$(document).ready(function () {
$('#Companies').attr('name', ' ');
};
更改输入名称

$(document).ready(function () {
$('#Companies').attr('name', ' ');
};

该错误与哪个属性相关(这些错误表明您的视图中有某些内容试图绑定到
角色
公司
——您是否有任何与之相关的输入?)当数据提交回控制器时,角色属性为null。但当页面加载时,页面上的一切都正常。当我提交回控制器时,我看到角色为null。除非您在表单中创建了与该属性关联的输入,否则角色将不会为null。您需要编辑问题以显示这一点(我假设您尝试过类似于
@Html.HiddenFor(m=>m.Roles)的东西)
这将导致没有我没有使用任何隐藏的..您可以检查第一个屏幕截图,您可以在那里看到模型中有Roles属性和数据。html也有模型。Roles但是当相同的内容提交回controller时,它为空您没有显示相关信息。第一个屏幕截图没有告诉我们任何信息-并且视图不会显示hr如果
角色
为空,则显示异常:)。您希望看到什么?您的正在为
角色
属性中每个
SelectListItem
的每个属性生成表单控件,这样属性就不会被
DefaultModelBinder
填充。但这并不能解释您声明的
ModelState
错误消息,该消息表明您确实有一个隐藏的输入,就像我在中建议的那样我以前的评论该错误与哪个属性相关(这些错误表明您的视图中有某些内容试图绑定到
角色
公司
——您是否有任何与之相关的输入?)当数据提交回控制器时,角色属性为null。但当页面加载时,页面上的一切都正常。当我提交回控制器时,我看到角色为null。除非您在表单中创建了与该属性关联的输入,否则角色将不会为null。您需要编辑问题以显示这一点(我假设您尝试过类似于
@Html.HiddenFor(m=>m.Roles)的东西)
这将导致没有我没有使用任何隐藏的..您可以检查第一个屏幕截图,您可以在那里看到模型中有Roles属性和数据。html也有模型。Roles但是当相同的内容提交回controller时,它为空您没有显示相关信息。第一个屏幕截图没有告诉我们任何信息-并且视图不会显示hr如果
角色
为空,则显示异常:)。您希望看到什么?您的正在为
角色
属性中每个
SelectListItem
的每个属性生成表单控件,这样属性就不会被
DefaultModelBinder
填充。但这并不能解释您声明的
ModelState
错误消息,该消息表明您确实有一个隐藏的输入,就像我在中建议的那样我以前的评论这是一个类似的问题,Ajax试图以字符串形式传递类型列表