MVC4实体框架 - 如何显示一对多关系

时间:2014-04-08 17:09:10

标签: asp.net-mvc entity-framework asp.net-mvc-4 razor-2

我有一个具有一对多关系的类,并尝试在视图中显示虚拟对象。我对MVC和EF相当新,所以这可能很简单。

我正在尝试在“请求/创建”操作视图上显示PODObject的下拉列表。

以下是模型

 public class PODObject
    {
        public int PODObjectID { set; get; }
        public string name { set; get; }
        public string CustomAttribute1 { set; get; }
        public string CustomAttribute2 { set; get; }
        public string CustomAttribute3 { set; get; }
        public string CustomAttribute4 { set; get; }
        public string CustomAttribute5 { set; get; }
        public virtual ICollection<BookingObject> BookingObjectspublic { set; get; }    
    }

public class RequestsQueueObject
{
    // Request Attributes
    public int RequestsQueueObjectID { set; get; }
    public string CustomAttribute1 { set; get; }
    public string CustomAttribute2 { set; get; }
    public string CustomAttribute3 { set; get; }
    public string CustomAttribute4 { set; get; }
    public string CustomAttribute5 { set; get; }

    public int PODObjectID { set; get; }

    public virtual PODObject PODObject { set; get; }
}

这是控制器创建动作

public ActionResult Create([Bind(Include="RequestsQueueObjectID,POCPODAccess,CustomAttribute1,CustomAttribute2,CustomAttribute3,CustomAttribute4,CustomAttribute5")] RequestsQueueObject requestsqueueobject)
    {
        if (ModelState.IsValid)
        {
            db.RequestsQueueObjects.Add(requestsqueueobject);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(requestsqueueobject);
    }

这是cshtml

<div class="form-group">
            @Html.DropDownListFor(model => model.PODObject, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PODObject)
                @Html.ValidationMessageFor(model => model.PODObject)
            </div>
        </div>

2 个答案:

答案 0 :(得分:0)

也许我错了,但你的PODOObject看起来不像是List,数组或者其他什么,所以你不能真正将它用作下拉列表的来源......

答案 1 :(得分:0)

认为您正在寻找的是能够从现有PODObject个实例列表中进行选择,以设置为RequestQueueObject的相关项目。你有一些问题需要清理。

  1. 您在RequestQueueObject上有一个属性来保存与PODObject的关系的ID,但目前尚未使用此属性。实体框架的约定是查找具有命名模式[RelatedProperty][RelatedClassIdProperty]的属性。在您的方案中,这将是PODObjectPODObjectIDPODObject_PODObjectID。您可以通过将ForeignKey属性添加到PODObjectID属性来清除它:

    [ForeignKey("PODObject")]
    public int PODObjectID { get; set; }
    
  2. Html.DropDownListFor需要IEnumerable<SelectListItem>作为其第二个参数,您目前没有这个参数。 MVC不会为你做这件事;你需要自己创建选择列表。理想情况下,您将使用视图模型作为属性,但目前您可以使用ViewBag

    在您的行动中

    var podObjectChoices = db.PODObjects.Select(m => new SelectListItem
        {
            Value = m.PODObjectID,
            Text = m.name
        });
    ViewBag.PODObjectChoices = podObjectChoices.ToList();
    return View();
    

    在您的视图中

    @Html.DropDownListFor(m => m.PODObjectID, (IEnumerable<SelectListItem>)ViewBag.PODOBjectChoices, new { @class = "control-label col-md-2" })
    
  3. 我刚刚在上面的示例代码中介绍了这一点,但您无法通过下拉列表直接设置PODOBject。相反,您为关系设置了外键属性PODOBjectID,实体框架将连接它。