没有类型为';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项

验证失败时。

没有类型为';IEnumerable<;选择列表项>';其具有键<;x>;

错误消息非常简单。您使用的是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中使用视图模型要容易得多。