【问题标题】:MVC4 Razor drop down list binding with foreign keyMVC4 Razor 下拉列表与外键绑定
【发布时间】:2012-12-12 12:20:08
【问题描述】:

所以我想有更深入的了解。我在 MVC4 上的 MSFT 教程中添加了更多功能,您可以在此处找到 (http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4)

模型非常简单。你有电影和导演。每部电影最多有 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);
    }

Edit 方法接收的参数电影带有一个 Director 属性(正如我在模型中指定的那样),当我浏览它时,我看到了两个来自 director 的属性: “ID”:带有用户从下拉列表中选择的正确值,“名称”:设置为空。 正如您在代码中看到的,我从数据库中选择与下拉值匹配的整个 director 对象并保存它

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

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

【问题讨论】:

标签: asp.net-mvc-4 ef-code-first foreign-keys html.dropdownlistfor


【解决方案1】:

将 Director 的 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>
    ...

【讨论】:

  • 谢谢! SelectList 解决了一切 :) 我必须从您的代码中更改的唯一一件事是下一行第二个参数中“ID”中的“DirectorId”,因为它采用了导演模型(不是电影)ViewBag.DirectorId = new SelectList(db.Directors, "ID", "Name", movie.DirectorId);中的 prpoerty 名称>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
相关资源
最近更新 更多