导致无效模型状态的下拉菜单.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并贯穿代码但是,我希望用户可以选择与他的公司关联。
谢谢。
当您有更好的方法——在模型中加入选择列表时,为什么需要设置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。下拉菜单肯定关心数据的显示顺序,因此您的模型应该反映这一点。