3

因此,我想有一个更深入的了解。我向MVC4上的MSFT教程添加了一点功能,您可以在这里找到(http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4MVC4剃须刀下拉列表与外键绑定

该模型非常简单。你有电影和导演。每部电影最多有1位导演。

我希望用户能够从一个下拉列表中分配一个导演到电影并保存它,但不知何故电影被保存在数据库中的空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); 
    } 

的编辑方法接收带有一个导演财产(如我在模型中指定)的论点电影,当我浏览到它,我看到两个特性表单编辑: “ID”:它带有用户从下拉列表中选择的适当值,“Name”:设置为null。 正如您在代码中看到的,我从数据库中选择与下拉值相匹配的整个控制器对象并保存它

问题是保存电影时,Movies表(Director_ID)上的外键永远不会更新。

我在做什么错?有没有更好的方法来做到这一点?

+0

替代方法[下拉绑定检查此演示](http://lesson8.blogspot.in/2013/06/bind-dropdownlist-in-mvc4-razor.html) – Sender

回答

4

模型的董事部分的制作标识,像

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> 
    ... 
+0

Thnaks! SelectList解决了everthing :) 我必须从你的代码改变的唯一的事情是来自第二个参数中的“ID”的“DirectorId”,因为它需要来自导演模型的公钥名称.DirectorId = new SelectList(db.Directors,“ID”,“Name”,movie.DirectorId);' –