没有类型为';IEnumerable<;选择列表项>';其具有键<;x>;
本文关键字:gt lt 列表 类型 IEnumerable 选择 | 更新日期: 2023-09-27 18:25:07
我有一个包含两个DropDownList和两个TextFields的页面。这两个DropDownList都是使用Microsoft Visual Studio 2015中的ADO.Net实体模型从mySQl数据库表中填充的。控制器
[HttpGet]
public ViewResult MngBranch()
{
DbModel pdb = new DbModel();
ViewBag.type = new SelectList(pdb.branchtypes, "Id", "Type");
ViewBag.name = new SelectList(pdb.companies, "IdCompany", "CompanyName");
return View();
}
[HttpPost]
public ViewResult MngBranch(Branch branch)
{
if (ModelState.IsValid)
{
ViewBag.Name = branch.BranchName;
return View("BranchSaved");
}
else
{
return View();
}
}
查看
@using (Html.BeginForm())
{
@Html.ValidationSummary()
<p>Company Name: @Html.DropDownListFor(x => x.CompanyName, (SelectList)ViewBag.name,"Choose an option")</p>
<p>Branch Name: @Html.TextBoxFor(x => x.BranchName)</p>
<p>Branch Code: @Html.TextBoxFor(x => x.BranchCode)</p>
<p>Branch Type:@Html.DropDownListFor(x => x.BranchType, (SelectList)ViewBag.type, "Choose an option")
</p>
出于某种原因,在这个特定的视图中,我得到了错误:
不存在具有键"CompanyName"的"IEnumerable <SelectListItem>
"类型的ViewData项
验证失败时。
错误消息非常简单。您使用的是ViewData
,而不是视图模型。因此,您不可能期望能够在视图中使用强类型的帮助程序,如Html.DropDownListFor
。您应该在将传递给视图的控制器操作中创建视图模型的实例。
因此,一如既往地,从编写一个合适的视图模型开始:
public class MyViewModel
{
[Required]
public string CompanyName { get; set; }
[Required]
public string BranchType { get; set; }
public string BranchName { get; set; }
public string BranchCode { get; set; }
public IEnumerable<SelectListItem> CompanyNames { get; set; }
public IEnumerable<SelectListItem> BranchTypes { get; set; }
}
现在您已经有了视图模型,只需填充它:
[HttpGet]
public ActionResult MngBranch()
{
DbModel pdb = new DbModel();
var model = new MyViewModel();
model.BranchTypes = new SelectList(pdb.branchtypes, "Id", "Type");
model.CompanyNames = new SelectList(pdb.companies, "IdCompany", "CompanyName");
return View(model);
}
[HttpPost]
public ViewResult MngBranch(MyViewModel model)
{
if (ModelState.IsValid)
{
return View("BranchSaved");
}
else
{
DbModel pdb = new DbModel();
// You need to repopulate the drop down box values
// if you are going to redisplay the same view
model.BranchTypes = new SelectList(pdb.branchtypes, "Id", "Type");
model.CompanyNames = new SelectList(pdb.companies, "IdCompany", "CompanyName");
return View(model);
}
}
现在剩下的就是确保你的视图被强类型化为这个视图模型(而不是你的域模型):
@model MyViewModel
@using (Html.BeginForm())
{
@Html.ValidationSummary()
<p>
Company Name:
@Html.DropDownListFor(x => x.CompanyName, Model.CompanyNames, "Choose an option")
</p>
<p>
Branch Name:
@Html.TextBoxFor(x => x.BranchName)
</p>
<p>
Branch Code:
@Html.TextBoxFor(x => x.BranchCode)
</p>
<p>
Branch Type:
@Html.DropDownListFor(x => x.BranchType, Model.BranchTypes, "Choose an option")
</p>
}
正如您所看到的,在ASP.NET MVC中使用视图模型要容易得多。