Asp.net mvc 4 使用外键绑定的MVC4 Razor下拉列表

Asp.net mvc 4 使用外键绑定的MVC4 Razor下拉列表,asp.net-mvc-4,ef-code-first,foreign-keys,html.dropdownlistfor,Asp.net Mvc 4,Ef Code First,Foreign Keys,Html.dropdownlistfor,所以我想有一个更深入的了解。我在MVC4的MSFT教程中添加了更多的功能,您可以在这里找到() 模型非常简单。你有电影和导演。每部电影最多有一名导演 我希望用户能够从下拉列表中为电影分配导演并保存它,但不知何故,该电影会在数据库中使用空的director\u ID字段保存 以下是我的简单模型: public class Movie { public int ID { get; set; } [Required] public string Title { get; set

所以我想有一个更深入的了解。我在MVC4的MSFT教程中添加了更多的功能,您可以在这里找到()

模型非常简单。你有电影和导演。每部电影最多有一名导演

我希望用户能够从下拉列表中为电影分配导演并保存它,但不知何故,该电影会在数据库中使用空的director\u 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\u ID字段。好极了

我希望用户在编辑电影时从下拉列表中选择导演,以便 在电影编辑视图中,我设法将下拉列表绑定到从数据库中获取的所有导演的列表

    <div class="editor-field">
        @Html.DropDownListFor(model => model.Director.ID, ViewBag.Directors as List<SelectListItem>, "All")            
    </div>
Edit方法接收的参数电影带有一个Director属性(如我在模型中指定的),当我浏览它时,我会看到Director的两个属性: “ID”:它带有用户从下拉列表中选择的正确值,“Name”:设置为null。 正如您在代码中看到的,我从与下拉值匹配的数据库中选取整个director对象并保存它

问题是,在保存电影时,电影表上的外键(Director_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)
    {
        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);
    }
//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>
    ...
编辑
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
电影
...
@LabelFor(model=>model.DirectorId,“Director”)
@DropDownList(“DirectorId”,String.Empty)
@Html.ValidationMessageFor(model=>model.DirectorId)
...

Thnaks!SelectList解决了所有问题:)我唯一需要从代码中更改的是followings行第二个参数中的“ID”改为“DirectorId”,因为它从directors model(而不是movies)中获取了prpoerty名称
ViewBag.DirectorId=new SelectList(db.directors,“ID”,“name”,moview.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>
    ...