【问题标题】:Entity relationship in DropdownListForDropdownListFor 中的实体关系
【发布时间】:2013-09-10 15:35:24
【问题描述】:

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

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; }
    }
}

当我访问编辑表单时,我从数据库中的 Director 加载一个 SelectList:

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。

所以,我肯定缺少直接绑定 Director 的东西。

【问题讨论】:

  • 您的下拉列表是一个 ID 列表,您的 director 属性的类型是 Director。您应该在该 Movie 类的某处有一个 DirectorID 属性。
  • 难道没有办法在不添加 DirectorID 的情况下完成同样的任务吗?
  • 您必须构建一个自定义模型绑定器才能使其工作。或者更好的方法是专门为表单创建一个 ViewModel,包含 DirectorId 属性。
  • 请显示控制器动作,httpPost 一个
  • 我会检查自定义模型绑定器。

标签: c# asp.net-mvc-4 razor


【解决方案1】:

如果您不想按照惯例修改 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;

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

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

【讨论】:

  • 这与他发布的内容有何不同? IMO 做同样的事情。
  • @mxmissile 你是对的。谢谢你。我没有以正确的方式理解问题。
  • 好吧,我要避免的是将该属性 directorID 添加到我的电影模型中。
  • @federico.luppi 不要将其添加到您的 Move 模型中。您创建一个包含 DirectorID 的新“表单模型”。然后从表单模型更新您的电影模型。实际上,我更喜欢为我的视图和表单使用专门的模型,而不是发送我的数据库填充域模型。然后我不必用所有这些视图验证废话来装饰我的域模型以及其他好处。
  • @mxmissile 它将用于保存数据。但是如果电影数据库表不包含directorID字段,我们将如何取回电影的导演呢?可能是我没有正确理解您的评论。
【解决方案2】:

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

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。

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

【讨论】:

  • 使用此解决方案,当我加载电影时不会填充 Director 属性。所以我不能做类似movie.director.name的事情
猜你喜欢
  • 1970-01-01
  • 2017-01-06
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2012-05-21
  • 1970-01-01
  • 2012-01-01
相关资源
最近更新 更多