Asp.net DropDownListFor";该值无效";设置导航属性时

Asp.net DropDownListFor";该值无效";设置导航属性时,asp.net,entity-framework,razor,drop-down-menu,asp.net-mvc-5,Asp.net,Entity Framework,Razor,Drop Down Menu,Asp.net Mvc 5,我试图根据DropDownList的返回值设置导航属性(外键) 我有以下数据模型: (为了简洁起见,省略了一些属性和细节) 具有Guid Id和来宾集合的邀请 public class Invite { public Guid InviteId { get; set; } public virtual ICollection<Guest> Guests { get; set; } } 在我的DataInitaliser中,我可以正确构建这些对象,并将它们发送到数据

我试图根据DropDownList的返回值设置导航属性(外键)

我有以下数据模型:

(为了简洁起见,省略了一些属性和细节)

具有Guid Id和来宾集合的邀请

public class Invite
{
    public Guid InviteId { get; set; }

    public virtual ICollection<Guest> Guests { get; set; }
}
在我的DataInitaliser中,我可以正确构建这些对象,并将它们发送到数据库,例如:

new Invite()
{
    InviteId = Guid.NewGuid(),
    Name = "Bloggs",
    AllDay = false,
    Guests = new List<Guest>()
        {
            new Guest() { GuestId = Guid.NewGuid(), FirstName = "Joe", LastName = "Bloggs", Vip = false},
        }
};
我在Guest视图中显示对象列表,如下所示:

@model Models.Guest
    <div class="form-group">
        @Html.LabelFor(model => model.Invite, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Invite, (IEnumerable<SelectListItem>)ViewBag.Invites, String.Empty)
            @Html.ValidationMessageFor(model => model.Invite)
        </div>
    </div>
我确实尝试过更改我的PopulateInvite集合,使其填充一个实际的Invite对象,如下所示:

    void PopulateInvite(object invite)
    {
        var query = db.Invites.Select(i => i).OrderBy(i => i.Name).ToList().Select(i => 
            {
                return new
                {
                    Invite = new Invite() { InviteId = i.InviteId },
                    Name = i.Name
                };
            });

        ViewBag.Invites = new SelectList(query, "Invite", "Name", invite);
    }
但是,这也失败了,错误与上面相同,令人困惑的是,返回的是对象的字符串表示,而不是实际对象本身

ModelState["Invite"].Value.RawValue
{string[1]}
    [0]: "Models.Invite"
那么…设置基于表单中的帖子的导航属性的正确方法是什么

我应该在
ModelState.IsValid
之前将Guid更改为实际的Invite对象吗

正如asp.net中的建议,我应该添加一个属性来保存InviteId,而不是使用invite对象吗?在示例中,
部门
未使用,因此我真的不明白为什么要添加它-我是否遗漏了什么

public class Course
{
    public int DepartmentID { get; set; }

    public virtual Department Department { get; set; }
}

还有其他更好的方法吗

答案在我在问题中链接的实际教程中。我需要添加一个
InviteId
字段作为外键,然后实际对象作为导航属性,如下所述,这两个属性都是必需的(而不仅仅是我使用的一个)

StudentID属性是一个外键,对应的 导航属性为Student。已关联注册实体 具有一个学生实体,因此该属性只能包含一个学生实体 学生实体(与学生注册导航属性不同) saw(可容纳多个注册实体)

CourseID属性是外键,对应的 当然,导航属性是重要的。注册实体与 一个课程实体

实体框架将属性解释为外键属性,如果 它的名字是 例如,自 学生实体的主键是ID)。外键属性也可以 简单地命名相同(例如, CourseID,因为课程实体的主键是CourseID)


答案在我在问题中链接的实际教程中。我需要添加一个
InviteId
字段作为外键,然后实际对象作为导航属性,如下所述,这两个属性都是必需的(而不仅仅是我使用的一个)

StudentID属性是一个外键,对应的 导航属性为Student。已关联注册实体 具有一个学生实体,因此该属性只能包含一个学生实体 学生实体(与学生注册导航属性不同) saw(可容纳多个注册实体)

CourseID属性是外键,对应的 当然,导航属性是重要的。注册实体与 一个课程实体

实体框架将属性解释为外键属性,如果 它的名字是 例如,自 学生实体的主键是ID)。外键属性也可以 简单地命名相同(例如, CourseID,因为课程实体的主键是CourseID)


无法绑定复杂组件(如模型)。请在DropDownList中邀请:

@Html.DropDownListFor(model => model.Invite, (IEnumerable<SelectListItem>)ViewBag.Invites, String.Empty
@Html.DropDownListFor(model=>model.Invite,(IEnumerable)ViewBag.invests,String.Empty
您需要从ID中输入一个类似int的单数值。请尝试将上面的代码替换为:

@Html.DropDownListFor(model => model.Invite.InviteID, (IEnumerable<SelectListItem>)ViewBag.Invites, String.Empty
@Html.DropDownListFor(model=>model.Invite.InviteID,(IEnumerable)ViewBag.Invites,String.Empty

您无法绑定复杂的组件,如模型。请在DropDownList中邀请:

@Html.DropDownListFor(model => model.Invite, (IEnumerable<SelectListItem>)ViewBag.Invites, String.Empty
@Html.DropDownListFor(model=>model.Invite,(IEnumerable)ViewBag.invests,String.Empty
您需要从ID中输入一个类似int的单数值。请尝试将上面的代码替换为:

@Html.DropDownListFor(model => model.Invite.InviteID, (IEnumerable<SelectListItem>)ViewBag.Invites, String.Empty
@Html.DropDownListFor(model=>model.Invite.InviteID,(IEnumerable)ViewBag.Invites,String.Empty
@Html.DropDownListFor(model => model.Invite, (IEnumerable<SelectListItem>)ViewBag.Invites, String.Empty
@Html.DropDownListFor(model => model.Invite.InviteID, (IEnumerable<SelectListItem>)ViewBag.Invites, String.Empty