我有以下创建视图
@model Inspinia_MVC5.Areas.GlobalAdmin.Models.Propiedad
@{
ViewBag.Title = "Create";
Layout = "~/Areas/GlobalAdmin/Views/Shared/_LayoutGlobalAdmin.cshtml";
}
<div class="row wrapper border-bottom white-bg page-heading">
<div class="col-sm-4">
<h2>Create</h2>
<ol class="breadcrumb">
<li>
@Html.ActionLink("List", "Index")
</li>
<li class="active">
<strong>Create</strong>
</li>
</ol>
</div>
<div class="col-sm-8">
<div class="title-action">
@Html.ActionLink("Back to List", "Index", null, new { @class = "btn btn-primary"})
</div>
</div>
</div>
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-lg-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>Create Propiedad</h5>
</div>
<div class="ibox-content">
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.Entidad, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("Entidades", (IEnumerable<SelectListItem>)ViewData["Entidades"], new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Codigo, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Codigo)
@Html.ValidationMessageFor(model => model.Codigo)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Nombre, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Nombre)
@Html.ValidationMessageFor(model => model.Nombre)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.TipoDeDatos, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.TipoDeDatos)
@Html.ValidationMessageFor(model => model.TipoDeDatos)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-primary" />
@Html.ActionLink("Cancel", "Index", null, new { @class = "btn btn-white"})
</div>
</div>
</div>
}
</div>
</div>
</div>
</div>
</div>
我有这个控制器
public class PropiedadesController : Controller
{
private AppDataContext db = new AppDataContext();
public ActionResult SelectCategory()
{
List<SelectListItem> items = new List<SelectListItem>();
foreach(Entidad entidad in db.Entidades.ToList())
{
items.Add(new SelectListItem { Text = entidad.Nombre, Value = entidad.Id.ToString() });
}
ViewBag.Entidades = items;
return View();
}
// GET: /GlobalAdmin/Propiedades/
public ActionResult Index()
{
return View(db.Propiedades.ToList());
}
// GET: /GlobalAdmin/Propiedades/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Propiedad propiedad = db.Propiedades.Find(id);
if (propiedad == null)
{
return HttpNotFound();
}
return View(propiedad);
}
// GET: /GlobalAdmin/Propiedades/Create
public ActionResult Create()
{
AppDataContext db = new AppDataContext();
var entidades = from c in db.Entidades select c;
List<SelectListItem> items = new List<SelectListItem>();
foreach (Entidad entidad in entidades)
{
items.Add(new SelectListItem { Text = entidad.Nombre, Value = entidad.Id.ToString() });
}
ViewBag.Entidades = items;
return View();
}
// POST: /GlobalAdmin/Propiedades/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include="Id,Codigo,Nombre,TipoDeDatos")] Propiedad propiedad)
{
if (ModelState.IsValid)
{
db.Propiedades.Add(propiedad);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(propiedad);
}
// GET: /GlobalAdmin/Propiedades/Edit/5
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
AppDataContext db = new AppDataContext();
var entidades = from c in db.Entidades select c;
List<SelectListItem> items = new List<SelectListItem>();
foreach (Entidad entidad in entidades)
{
items.Add(new SelectListItem { Text = entidad.Nombre, Value = entidad.Id.ToString() });
}
ViewBag.Entidades = items;
Propiedad propiedad = db.Propiedades.Find(id);
if (propiedad == null)
{
return HttpNotFound();
}
return View(propiedad);
}
// POST: /GlobalAdmin/Propiedades/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="Id,Codigo,Nombre,TipoDeDatos")] Propiedad propiedad)
{
if (ModelState.IsValid)
{
db.Entry(propiedad).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(propiedad);
}
// GET: /GlobalAdmin/Propiedades/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Propiedad propiedad = db.Propiedades.Find(id);
if (propiedad == null)
{
return HttpNotFound();
}
return View(propiedad);
}
// POST: /GlobalAdmin/Propiedades/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Propiedad propiedad = db.Propiedades.Find(id);
db.Propiedades.Remove(propiedad);
db.SaveChanges();
return RedirectToAction("Index");
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
但是,当我创建一行时,数据库将外键显示为null(Entidad ID)
我在这里缺少什么?
Propiedad Model就是这个
public class Propiedad
{
[Key]
public int Id { get; set; }
public virtual Entidad Entidad { get; set; }
public string Codigo { get; set; }
public string Nombre { get; set; }
public string TipoDeDatos { get; set; }
}
截图
http://screencast.com/t/B5m6X8mtbSdd
更新1:我修改了这样的控制器:
public ActionResult Create() { ViewBag.Entidad = new SelectList(db.Entidades,“Id”,“Nombre”); return View(); }
和这样的观点:
<div class="form-group">
@Html.LabelFor(model => model.Entidad, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.Entidad.Id, new SelectList(ViewBag.Entidad, "Id", "Nombre", Model.Entidad.Id), "Seleccionar", new { @class = "form-control" })
</div>
</div>
但是在视图中,我得到的对象引用未设置为对象的实例。
这是实体模型
public class Entidad
{
[Key]
public int Id { get; set; }
public string Nombre { get; set; }
public virtual ICollection<Propiedad> Propiedades { get; set; }
}
和属性模型
public class Propiedad
{
[Key]
public int Id { get; set; }
public virtual Entidad Entidad { get; set; }
public string Codigo { get; set; }
public string Nombre { get; set; }
public string TipoDeDatos { get; set; }
}
答案 0 :(得分:3)
我看不到您在视图中打印下拉列表的位置。
试试这个: 在您的控制器中加载列表:
ViewBag.entities = new SelectList(db.Entidades, "Id", "Nombre") ;
然后在表格中查看:
@Html.DropDownListFor(model => model.Entidad.Id, (SelectList) ViewBag.entities, "Seleccionar")
与您的班级等效的模型:Propiedad
使用此功能,您将自动接收具有所选值的对象。