通过 Razor 页面传递多个参数值

man*_*ash 5 c# entity-framework-6 asp.net-core razor-pages asp.net-core-3.0

我正在尝试使用 ASP.NET Core 3.0 和 Entity Framework 6 在 Razor 页面上使用复合键对实体进行删除操作。有问题的实体是一个CourseAssignment复合键由一个InstructorID值和一个CourseID值组成的实体.

对于具有普通单字段键的Course实体(例如具有CourseID主键的实体),razor 页面上的代码是这样的:

<form method="post">
  <input type="hidden" asp-for="Course.CourseID" />
  <input type="submit" value="Delete" class="btn btn-danger" /> |
  <a asp-page="./Index">Back to List</a>
</form>
Run Code Online (Sandbox Code Playgroud)

这会产生这样的 URL: https://localhost:44388/Courses/Delete?id=1045

对此起作用的 C# 代码是:

<form method="post">
  <input type="hidden" asp-for="Course.CourseID" />
  <input type="submit" value="Delete" class="btn btn-danger" /> |
  <a asp-page="./Index">Back to List</a>
</form>
Run Code Online (Sandbox Code Playgroud)

如何更改 razor 页面和 C#OnPostAsync操作以处理具有需要两个值的复合键的实体?

谢谢!

Cam*_*ker 4

将您的 HTML 表单更新为如下所示:

<form method="post">
    <input type="hidden" asp-for="Course.CourseID" />
    <input type="hidden" asp-for="Course.InstructorID" />
    <input type="submit" value="Delete" class="btn btn-danger" /> |
    <a asp-page="./Index">Back to List</a>
</form>
Run Code Online (Sandbox Code Playgroud)

创建一个新类来处理复合键。您也可以使用现有的视图模型类。

public class DeleteCourseRequest {
  public int CourseId { get; set; }
  public int InstructorId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后将控制器的 OnPostAsync 操作更新为如下所示:

public async Task<IActionResult> OnPostAsync(DeleteCourseRequest request) {
  if (request == null) {
    return NotFound();
  }

  Course = await _context.Courses.FirstOrDefaultAsync(c => c.CourseID == request.CourseID && c.InstructorID == request.InstructorID);

  if (Course != null) {
    _context.Courses.Remove(Course);
    await _context.SaveChangesAsync();
  }

  return RedirectToPage("./Index");
}
Run Code Online (Sandbox Code Playgroud)

问题是,当使用多个参数进行 Post 时,您要么必须使用参数,[FromBody]要么必须[FromUri]绑定参数。这告诉 ASP.NET Web API 在哪里解析参数。另一种选择是使用视图模型将信息从表单传递到控制器。