gpt4 book ai didi

asp.net-mvc-4 - MVC4 Razor 下拉列表与外键绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 20:01:41 26 4
gpt4 key购买 nike

因为我想有更深入的了解。我在 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字段。甜甜的!

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

    <div class="editor-field">
@Html.DropDownListFor(model => model.Director.ID, ViewBag.Directors as List<SelectListItem>, "All")
</div>

Controller :

    //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 属性(正如我在模型中指定的那样),当我浏览它时,我看到了director 的两个属性:“ID”:带有用户从下拉列表中选择的正确值,“Name”:设置为 null。正如您在代码中看到的,我从数据库中选择与下拉值匹配的整个导演对象并保存它

问题是,保存电影时,电影表 (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; }
}

然后在你的 Controller 中:

//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>
...

关于asp.net-mvc-4 - MVC4 Razor 下拉列表与外键绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14049098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com