导致无效模型状态的下拉菜单.ASP.NET MVC 3

本文关键字:ASP NET MVC 下拉菜单 无效 模型 状态 | 更新日期: 2023-09-27 18:27:35

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

这是我的下拉代码:

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

以下是我在视图模型中的关联代码:

[Display(Name = "Company")]    
public int? CompanyId { get; set; }
public IEnumerable<SelectListItem> Companies { get; set; }

在我返回视图之前,这是我在控制器中的相关代码:

ViewBag.Companies = new SelectList(db.Companies, "CompanyId", "CompanyName");

在调试时,我发现ModelState.IsValid返回false,因此重新返回视图(在我的情况下重新设置ViewBag.Companies)。

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

谢谢。

导致无效模型状态的下拉菜单.ASP.NET MVC 3

当您有更好的方法——在模型中加入选择列表时,为什么需要设置ViewBag.Companies?无需使用难看的ViewBag

你应该有这样的

ViewModel

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>

这将在服务器上正确绑定您的CompanyId

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

DropDownList在ASP.Net MVC3中有点奇怪。它将无法正确绑定到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>

然后,在模型中,将SelectListItems的IEnumerable更改为字符串的IEnumarable。

[Display(Name = "Company")]    
public string CompanyId { get; set; }
public IEnumerable<string> Companies { get; set; }

最后,在您的控制器中,

ViewBag.Companies = db.Companies;

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