外键未显示在下拉框中 | MVC

Foreign Key not showing in dropdown box | MVC

我对 MVC 有点陌生,一直在关注教程,但它没有关于我的问题的答案。对于我的 Create 页面,外键没有显示。基本上,我在“项目”页面上创建了一个项目,在“人员”页面上创建了一个人。因此,当我尝试在 ProjectRoles 页面上创建 ProjectRole 时,ProjectIdPersonId 未显示在下拉菜单中。在我的所有代码下方,我提供了我试图用文字表达的内容的屏幕截图。

我的模特:

public class Project
{
    public int Id { get; set; }

    [Required]
    [MaxLength(30)]
    public string Name { get; set; }

    [Required]
    public DateTime StartDate { get; set; }

    [Required]
    public DateTime DueDate { get; set; }

    public ICollection<ProjectRole> ProjectRoles { get; set; }
}

public class Person
{
    public int Id { get; set; }

    [Required]
    [MaxLength(30)]
    public string FirstName { get; set; }

    [Required]
    [MaxLength(30)]
    public string MiddleName { get; set; }

    [Required]
    [MaxLength(30)]
    public string LastName { get; set; }

    [Required]
    public string Email { get; set; }

    public ICollection<ProjectRole> ProjectRoles { get; set; }
}
public class ProjectRole
{
    public int Id { get; set; }

    [Required]
    public double HourlyRate { get; set; }

    [ForeignKey("Person")]
    public int PersonId { get; set; }

    [ForeignKey("Project")]
    public int ProjectId { get; set; }

    [ForeignKey("AppRole")]
    public int RoleId { get; set; }

}

我的控制器代码:

public IActionResult Create()
{
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,HourlyRate,PersonId,ProjectId,RoleId")] ProjectRole projectRole)
{
    if (ModelState.IsValid)
    {
        _context.Add(projectRole);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View(projectRole);
}

我的查看代码在这里:

@model Project2.Models.Entities.ProjectRole

@{
    ViewData["Title"] = "Create";
}

<h1>Create</h1>

<h4>ProjectRole</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="HourlyRate" class="control-label"></label>
                <input asp-for="HourlyRate" class="form-control" />
                <span asp-validation-for="HourlyRate" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="PersonId" class="control-label"></label>
                <select asp-for="PersonId" class ="form-control" asp-items="ViewBag.PersonId"></select>
            </div>
            <div class="form-group">
                <label asp-for="ProjectId" class="control-label"></label>
                <select asp-for="ProjectId" class ="form-control" asp-items="ViewBag.ProjectId"></select>
            </div>
            <div class="form-group">
                <label asp-for="RoleId" class="control-label"></label>
                <input asp-for="RoleId" class="form-control" />
                <span asp-validation-for="RoleId" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

我的意思示例截图:

我想在 select 控件中显示 Person Name(和 Project Name)会更风度翩翩,但是单击 Create 按钮时将 PersonId(和 ProjectId)传递给 Create 方法。

因此,准备 Person 列表(和 Project 列表),如下所示:

public IActionResult Create()
{
    var persons = new List<SelectListItem>();
    // Iterate through `Persons`
    foreach(var p in _context.Persons)
    {
        persons.Add(new SelectListItem() { Value= p.Id, Text = p.FirstName+", "+p.LastName}); 
    }  
    ViewBag.Persons = persons; 

    // Prepare the projects list (like `Persons` list above)
    // ... your code here
    ViewBag.Projects = persons; 

    return View(new ProjectRole(){ /* Add your code here to create the ProjectRole .../* });
}

并且在视图中:

 <div class="form-group">
    <label asp-for="PersonId" class="control-label"></label>
    <select asp-for="PersonId" class="form-control" asp-items="ViewBag.Persons"></select>
</div>
<div class="form-group">
    <label asp-for="ProjectId" class="control-label"></label>
    <select asp-for="ProjectId" class="form-control" asp-items="ViewBag.Projects"></select>
</div>

有关其他信息,请参阅 The Select Tag Helper

*注意:我建议创建复合视图模型以包含所有必需的信息。 *