ASP.NET CORE MVC 从对象集合中选择列表

Cod*_*ean 5 c# asp.net-core

所以我有这两个类代表本地数据库中的表,在 asp.net core 应用程序中使用 ef core 迁移

public class Teacher
{
    public int ID { get; set; }

    public string FistName { get; set; }

    public string LastName { get; set; }

    public Class Class { get; set; }

    public string FullName
    {
        get
        {
            return $"{LastName} {FistName}";
        }
    }

    public override string ToString()
    {
        return FullName;
    }
}
Run Code Online (Sandbox Code Playgroud)

和

public class Class
{
    public int ID { get; set; }

    public int TeacherID { get; set; }

    public string Name { get; set; }


    public Teacher Teacher { get; set; }

    public ICollection<Student> Students { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想在我的课程控制器中添加以下功能:通过在文本框中输入名称并从下拉列表中选择教师来创建“Class”类的新实例。

这是我创建 http get 和 post 方法

    public IActionResult Create()
    {
        var teachers = from s in _context.Teachers
                           where s.Class == null
                           select s;

        ViewData["Teachers"] = new SelectList(teachers.ToList());
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(Class @class)
    {
        if (ModelState.IsValid)
        {
            @class.TeacherID = @class.Teacher.ID;
            _context.Add(@class);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View("Index");
    }
Run Code Online (Sandbox Code Playgroud)

以及提交用户输入数据的表格

<form asp-action="Create">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Teacher" class="control-label"></label>
            <select asp-for="Teacher" class ="form-control" asp-items="ViewBag.Teachers"></select>
        </div>
        <div class="form-group">
            <label asp-for="Name" class="control-label"></label>
            <input asp-for="Name" class="form-control" />
            <span asp-validation-for="Name" class="text-danger"></span>
        </div>
        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </form>
Run Code Online (Sandbox Code Playgroud)

我可以在下拉列表中看到正确的数据,但由于某种原因,POST 方法中 @class.Teacher 为空。我究竟做错了什么?

Tan*_*jel 7

Create GET首先按如下方式更新您的方法:

public async Task<IActionResult> Create()
{
    var teachers = await _context.Teachers.Where(t => t.Class == null).ToListAsync();
    ViewData["Teachers"] = new SelectList(teachers,"ID","FullName");
    return View();
}
Run Code Online (Sandbox Code Playgroud)

然后写下你的FormGroupforselect list如下:

<div class="form-group">
     <label asp-for="TeacherID" class="control-label">Teacher</label>
     <select asp-for="TeacherID" class ="form-control" asp-items="ViewBag.Teachers">
     </select>
     <span asp-validation-for="TeacherID" class="text-danger"></span>
</div>
Run Code Online (Sandbox Code Playgroud)

Create POST现在按如下方式更新您的方法:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Class @class)
{
    if (ModelState.IsValid)
    {
        _context.Classes.Add(@class); // now your @class is containing the `TeacheID` value selected from drop-down.
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View("Index");
}
Run Code Online (Sandbox Code Playgroud)

现在一切都应该正常了!