因此我希望有更深入的了解。我在MVC4的MSFT教程中添加了一些功能,你可以在这里找到(http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4)
模型非常简单。你有电影和导演。每部电影最多有1位导演
我希望用户能够从下拉列表中为导演分配导演并保存,但不知何故,电影会在数据库中使用null Director_ID字段保存。
以下是我的简单模型:
public class Movie
{
public int ID { get; set; }
[Required]
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
[Required]
public string Genre { get; set; }
public decimal Price { get; set; }
public string Ranking { get; set; }
public Director Director { get; set; }
}
public class Director
{
public int ID { get; set; }
public string Name { get; set; }
}
当影片表生成时,它附带一个Director_ID字段。甜!
我希望用户在编辑电影时从下拉列表中选择导演 在电影编辑视图中,我设法将下拉列表绑定到从数据库中获取的所有导演列表
<div class="editor-field">
@Html.DropDownListFor(model => model.Director.ID, ViewBag.Directors as List<SelectListItem>, "All")
</div>
控制器:
//GET
public ActionResult Edit(int id = 0)
{
var DirectorsList = new List<SelectListItem>();
var DirQuery = from d in db.Directors select d;
foreach (var d in DirQuery)
{
DirectorsList.Add(new SelectListItem { Value = d.ID.ToString(), Text = d.Name });
}
ViewBag.Directors = DirectorsList;
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
我在下拉列表中列出了所有导演。好的!
现在我保存电影时:
[HttpPost]
public ActionResult Edit(Movie movie)
{
if (ModelState.IsValid)
{
movie.Director = db.Directors.Find(movie.Director.ID);
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
Edit方法接收的参数影片附带一个Director属性(正如我在模型中指定的那样),当我浏览它时,我看到两个属性表单director: “ID”:带有用户从下拉列表中选择的正确值,“Name”:设置为null。 正如你在代码中看到的那样,我从匹配下拉值的数据库中选择整个director对象并保存它
问题是,在保存电影时,Movies表(Director_ID)上的外键永远不会更新。
我做错了什么?有没有更好的方法来做到这一点?
答案 0 :(得分:4)
将模型的ID作为模型的ID,例如
public class Movie
{
public int ID { get; set; }
[Required]
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
...
public int DirectorId { get; set; }
public virtual Director Director { get; set; }
}
然后在你的控制器中:
//GET
public ActionResult Edit(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
ViewBag.DirectorId = new SelectList(db.Directors, "DirectorId", "Name", movie.DirectorId);
...
}
在你看来:
<h2>Edit</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Movie</legend>
...
<div class="editor-label">
@Html.LabelFor(model => model.DirectorId, "Director")
</div>
<div class="editor-field">
@Html.DropDownList("DirectorId", String.Empty)
@Html.ValidationMessageFor(model => model.DirectorId)
</div>
...