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操作以处理具有需要两个值的复合键的实体?
谢谢!
将您的 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 在哪里解析参数。另一种选择是使用视图模型将信息从表单传递到控制器。