下拉列表中的实体关系

本文关键字:关系 实体 下拉列表 | 更新日期: 2023-09-27 18:30:52

目前我有以下实体:
电影:

public class Movie
{
    public int ID { get; set; }
    [Required]
    public string Title { get; set; }
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }
    [Required]
    public string Genre { get; set; }
    [DataType(DataType.Currency), Range(1,100)]
    public decimal Price { get; set; }
    [StringLength(5)]
    public string Rating { get; set; }
    [StringLength(200)]
    public string comments { get; set; }

    public Director director { get; set; }
}

导演:

[Table("Director")]
public class Director
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    [Required, MaxLength(50)]
    [Display(Name = "Name")]
    public string name { get; set; }
    [Required, MaxLength(50)]
    [Display(Name = "Last Name")]
    public string lastName { get; set; }
    [Required, Range(1,100)]
    public int age { get; set; }
    [NotMapped]
    public string fullName {
        get { return this.name + " " + this.lastName; }
    }
}

当我访问编辑表单时,我从数据库中的控制器加载一个选择列表:

public ActionResult Edit(int id = 0)
    {
        Movie movie = db.Movies.Find(id);
        if (movie == null)
        {
            return HttpNotFound();
        }
        ViewBag.Directors = new SelectList(db.Directors.ToList(), "ID", "fullname");
        return View(movie);
    }

然后我使用 @Html.DropDownListFor 以以下形式显示组合框:

 <div class="editor-field">
        @Html.DropDownListFor(model => model.director, (SelectList)ViewBag.Directors, "Select")
        @Html.ValidationMessageFor(model => model.director)
    </div>

一切似乎都很好,但是当我选择一个选项并尝试保存表单时,我收到一条验证消息,指出"值'1'无效"。其中"1"是控制器 ID。

所以,我肯定缺少一些直接约束导演的东西。

下拉列表中的实体关系

如果你不抱怨按照约定修改 ID,那么你可能会改变一些代码,这会创建 SelectList:

var list = new List<SelectListItem>;
var items = from n in db.Directors
            select new SelectListItem
            {
              Text = n.fullname,
              Value = n.ID
             };
//*Add your items to List
foreach (var item in items)
    list.Add(item);
ViewBag.Directors = list;

编辑:不要看我的第一部分。评论员是对的。您的模型未连接。您需要Movie模型中directorID属性才能使其正常工作。比你应该改变你的DropDownListFor作为福洛:

@Html.DropDownListFor(model => model.directorID, (SelectList)ViewBag.Directors, "Select")

您的实体是自动生成的,还是您自己生成的。如果你有自动生成的,导演和电影之间似乎没有关系。否则,您的电影将具有属性 DirectorID,而目录实体将具有电影的 ICollection。此外,在使用 DropDownlistFor 在导演的电影中,您应该导演ID,这将是正确的方法。即

public class Movie
{
public int ID { get; set; }
[Required]
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Required]
public string Genre { get; set; }
[DataType(DataType.Currency), Range(1,100)]
public decimal Price { get; set; }
[StringLength(5)]
public string Rating { get; set; }
[StringLength(200)]
public string comments { get; set; }
//change here
public int DirectorID {get; set;}
public Director director { get; set; }
}

选择列表将是

<div class="editor-field">
    @Html.DropDownListFor(model => model.DirectorID, (SelectList)ViewBag.Directors, "Select")
    @Html.ValidationMessageFor(model => model.DirectorID)
</div>

要填充控制器,您可以通过以下方式创建选择列表

var directors=db.Directors.Select(o=>new {ID=o.DirectorID, Name=o.DirectorName});

和 将此选择列表添加到视图包 像往常一样。

ViewBag.Directors = new SelectList(directors, "ID", "Name");