3

ですから、もっと深く理解したいと思ったからです。ここにある MVC4 の MSFT チュートリアルにもう少し機能を追加しました ( http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to -aspnet-mvc-4 )

モデルは非常に単純です。映画や監督がいます。すべての映画には最大 1 人の監督がいます。

ユーザーがドロップダウン リストから映画に監督を割り当てて保存できるようにしたいのですが、どういうわけか映画がデータベースの Director_ID フィールドが null で保存されてしまいます。

ここに私の単純なモデルがあります:

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 メソッドが受け取る引数 movie には、Director プロパティ (モデルで指定したとおり) が付属しています。参照すると、次の 2 つのプロパティが director から表示されます: "ID": ユーザーが選択した適切な値が付属しています。ドロップダウンと "Name": null に設定します。コードでわかるように、ドロップダウン値に一致するデータベースからディレクターオブジェクト全体を選択して保存します

問題は、ムービーを保存するときに、Movies テーブル (Director_ID) の外部キーが更新されないことです。

私は何を間違っていますか?これを行うためのより良いアプローチはありますか?

4

1 に答える 1

4

ディレクターの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>
    ...
于 2012-12-28T08:29:42.430 に答える