C# 导致模型状态无效的下拉菜单。ASP.NETMVC3

C# 导致模型状态无效的下拉菜单。ASP.NETMVC3,c#,asp.net-mvc,asp.net-mvc-3,drop-down-menu,C#,Asp.net Mvc,Asp.net Mvc 3,Drop Down Menu,我的web应用程序中有注册视图。但是,帐户注册将不成功,我的下拉菜单将以红色显示 这是我的下拉代码: <div class="editor-label"> @Html.LabelFor(model => model.CompanyId, "Company") </div> <div class="editor-field"> @Html.DropDownList("Companies", "<Select Compan

我的web应用程序中有注册视图。但是,帐户注册将不成功,我的下拉菜单将以红色显示

这是我的下拉代码:

<div class="editor-label">  
   @Html.LabelFor(model => model.CompanyId, "Company")  
</div>   
<div class="editor-field">  
   @Html.DropDownList("Companies", "<Select Company>")  
</div>
调试时,我发现
ModelState.IsValid
返回false,因此重新返回视图(在我的例子中,重新设置
ViewBag.companys

如何成功完成注册?我确实在参数内填写了每个必填字段。不需要选择公司当我未选择公司时,
ModelState.IsValid
返回true并运行代码。
但是,我希望用户可以选择与其公司关联


谢谢。

DropDownList在ASP.NETMVC3中有点奇怪。它将不会正确绑定到SelectListItem的可枚举项。您需要将绑定的选定选项存储到模型中的基本体,并将所有选项的列表存储在单独的字段中

<div class="editor-label">  
   @Html.LabelFor(model => model.CompanyId, "Company")  
</div>   
<div class="editor-field">  
   @Html.DropDownListFor(model => model.CompanyId, new SelectList(Model.Companies))  
</div>

作为旁注,我建议将IEnumerable改为IList。下拉菜单肯定关心数据的显示顺序,因此您的模型应该反映这一点。

为什么需要设置
ViewBag.companys
,而您有更好的方法-将选择列表放入模型中?不需要使用丑陋的可视包

你应该有这样的东西

视图模型

public class RegisterViewModel
{
     [Display(Name = "Company")]    
     public int? CompanyId { get; set; }

     public IEnumerable<SelectListItem> Companies { get; set; }
}
在我看来

<div class="editor-label">  
   @Html.LabelFor(model => model.CompanyId, "Company")  
</div>   
<div class="editor-field">  
   @Html.DropDownListFor(model => model.CompanyId, Model.Companies, "<Select Company>")  
</div>

@Html.LabelFor(model=>model.CompanyId,“公司”)
@Html.DropDownListFor(model=>model.CompanyId,model.companys,“”)

这将在服务器上正确绑定您的
公司ID

如果您选择的变量类型不是字符串,则您的模型状态对于您的下拉列表将始终无效。将CompanyId更改为string。您仍然可以使用IEnumerable companys{get;set;}

模型状态中的错误是什么?错误应该在
ModelState.Values
{System.invalidoOperationException:从类型'System.String'到类型'System.Web.Mvc.SelectListItem'的参数转换失败,因为没有类型转换器可以在这些类型之间转换。在System.Web.Mvc.ValueProviderResult.ConvertSimpleType(CultureInfo culture,Object value,Type destinationType)@nemesv^^^我现在正在研究这个。对于
公共字符串CompanyId
,为什么不
int CompanyId
?这样会给我一个
无效操作异常
。RegisterViewModel=new RegisterViewModel();viewModel.companys=new SelectList(db.companys,“CompanyId”,“CompanyName”);返回视图(viewModel);我以前尝试过这种方式,但由于类似的问题而被阻止。非常感谢您对更正此问题的任何帮助。您确定您完全复制了我发布的视图部分吗?我一直使用这种模式,而且效果很好。我只是重新整理了所有内容,它对我很有效。您一定在某个地方有一些旧代码-或者我不知道什么是无效的异常原因:)很好。我有一个db insert错误,引发了异常。再次感谢。
[Display(Name = "Company")]    
public string CompanyId { get; set; }

public IEnumerable<string> Companies { get; set; }
ViewBag.Companies = db.Companies;
public class RegisterViewModel
{
     [Display(Name = "Company")]    
     public int? CompanyId { get; set; }

     public IEnumerable<SelectListItem> Companies { get; set; }
}
[HttpGet]
public ActionResult Register()
{
     RegisterViewModel viewModel = new RegisterViewModel();
     viewModel.Companies = new SelectList(db.Companies, "CompanyId", "CompanyName");

     return View(viewModel);
}
<div class="editor-label">  
   @Html.LabelFor(model => model.CompanyId, "Company")  
</div>   
<div class="editor-field">  
   @Html.DropDownListFor(model => model.CompanyId, Model.Companies, "<Select Company>")  
</div>