【问题标题】:Simple Dropdownlist from a simple model with MVC4来自带有 MVC4 的简单模型的简单下拉列表
【发布时间】:2014-02-24 23:05:26
【问题描述】:

我有一个简单的模型:

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'.

有什么想法吗?

谢谢

【问题讨论】:

  • 嗨,谢谢我已经添加了控制器的代码

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

这样做:

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; }
    }

EntidateController.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)

【讨论】:

  • 您好,谢谢,但是为什么在创建操作中需要“[Bind(Include="Id,Nome,PaisId")]”?
  • [Bind(Include="")] 是可选的,因为我只是使用了自动生成的代码。当您只想将特定属性绑定到模型并排除其他属性时,基本上包含/排除很有用。更多信息可以找到stackoverflow.com/questions/19490121/…
  • 嗨,谢谢,我能够根据您的解决方案解决问题,只需两件事,ViewBag.PaisId 而不是 ViewBag.PaisSelectList 来映射表单提交字段和 @Html.DropDownList("PaisId ") 在视图中。请更改您的回复,以便我可以将其设置为正确的;)
【解决方案2】:

您正在为 Pais 实体创建下拉列表,而不是为它的 Id,所以:

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

但是,如果您没有将模型 Pais 属性设置为实例,这将导致 NullReferenceException。

附加提示:如果您可以尝试避免使用 ViewBag 或 ViewData。在这种情况下,您可以创建一个甚至从 Entidade 派生的 EntidadeViewModel 类,它可以具有 IEnumerable 类型的属性。这样您的代码将更具可读性和一致性。

【讨论】:

  • 我收到错误:没有具有键 'Pais.Id' 的 'IEnumerable' 类型的 ViewData 项。
【解决方案3】:

试试

ViewBag.Paises = db.Paises.ToList();

@Html.DropDownList("Id",new SelectList(ViewBag.Paises,"Id","Nome"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多