我有一个简单的模型:
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'.
有什么想法吗?
由于
答案 0 :(得分:0)
您正在为Pais实体创建adrop而不是它的Id,所以:
@Html.DropDownListFor(model => model.Pais.Id, ViewBag.Paises as SelectList)
但如果你没有将模型Pais属性设置为实例,那么这将以NullReferenceException结束。
Addtitional提示:如果您可以尝试避免使用ViewBag或ViewData。在此sitiation中,您可以创建一个甚至从Entidade派生的EntidadeViewModel类,它可以具有IEnumerable类型的属性。通过这种方式,您的代码将更具可读性和一致性。
答案 1 :(得分:0)
尝试
ViewBag.Paises = db.Paises.ToList();
@Html.DropDownList("Id",new SelectList(ViewBag.Paises,"Id","Nome"))
答案 2 :(得分:0)
这样做:
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);
}
Entidate Create.cshtml
@Html.DropDownList("PaisId", String.Empty)