代码之家  ›  专栏  ›  技术社区  ›  Patrick

使用MVC4的简单模型的简单下拉列表

  •  0
  • Patrick  · 技术社区  · 12 年前

    我有一个简单的模型:

    public partial class Entidade
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public string Nome { get; set; }
    
        public virtual Pais Pais { get; set; }
    }
    

    与Pais模型相关:

    public partial class Pais
    {
        public Pais()
        {
            this.Entidades = new HashSet<Entidade>();
        }
    
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public string Nome { get; set; }
    
        public virtual ICollection<Entidade> Entidades { get; set; }
    }
    

    我需要建立一个简单的Pais下拉列表来创建一个新的Entidade:

    <div class="editor-label">
        @Html.LabelFor(model => model.Pais, "Pais")
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.Pais, ViewBag.Paises as SelectList)
        @Html.ValidationMessageFor(model => model.Pais)
    </div>
    

    从控制器:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Entidade entidade)
    {
        if (ModelState.IsValid)
        {
            db.Entidades.Add(entidade);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    
        ViewBag.Paises = new SelectList(db.Paises, "Id", "Nome");
    
        return View(entidade);
    }
    

    但我得到了错误:

    There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Pais'.
    

    知道吗?

    谢谢

    3 回复  |  直到 12 年前
        1
  •  0
  •   jarnail    12 年前

    这样做:

    Pais.cs公司

    public Pais()
            {
                Entidades = new HashSet<Entidade>();
            }
    
            [Key]
            [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
            public int Id { get; set; }
            public string Nome { get; set; }
    
            public virtual ICollection<Entidade> Entidades { get; set; }
    

    Entidade.cs公司

    public class Entidade
        {
            [Key]
            [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
            public int Id { get; set; }
            public string Nome { get; set; }
    
            [ForeignKey("Pais")]
            public int PaisId { get; set; }
            public virtual Pais Pais { get; set; }
        }
    

    集成控制器.cs

    //GET: /Entidade/Create
     public ActionResult Create()
        {
            ViewBag.PaisId = new SelectList(db.Paises, "Id", "Nome");
            return View();
        }
    
    // POST: /Entidade/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Entidade entidade)
    {
        if (ModelState.IsValid)
        {
            db.Entidades.Add(entidade);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    
        ViewBag.PaisId = new SelectList(db.Paises, "Id", "Nome", entidade.PaisId);
        return View(entidade);
    }
    

    合并Create.cshtml

    @Html.DropDownList("PaisId", String.Empty)
    
        2
  •  0
  •   Peter Kiss    12 年前

    您正在为Pais实体而不是为其Id创建adrop down,因此:

    @Html.DropDownListFor(model => model.Pais.Id, ViewBag.Paises as SelectList)
    

    但是,如果不将model Pais属性设置为实例,那么这将导致NullReferenceException。

    附加提示:如果您可以避免使用ViewBag或ViewData。在此位置中,您可以创建一个EntidadeViewModel类,甚至可以从Entidade派生,并且该类可以具有IEnumerable类型的属性。这样,您的代码将更加可读和一致。

        3
  •  0
  •   Dakota    12 年前

    尝试

    ViewBag.Paises = db.Paises.ToList();
    
    @Html.DropDownList("Id",new SelectList(ViewBag.Paises,"Id","Nome"))