进入编辑视图前,需要获取此学生的ClassId,MajorId,GradeId以在进入视图后下拉列表能处于正确的选项。
在StudentRepo中添加GetWithClass方法:
代码如下:
public Student? GetWithClass(Guid id)
{
return DbSet.Include(s => s.Class).SingleOrDefault(s => s.Id == id);
}
这样获取的学生实体附带Class的数据。
在StudentService中添加GetEditModel方法以获取学生实体及下拉列表数据。
代码如下:
public StudentViewModel GetEditModel(Guid id)
{
Student? student = studentRepo.GetWithClass(id);
if (student == null)
{
throw new NullReferenceException();
}
StudentViewModel model = new StudentViewModel()
{
Id = student.Id,
Number = student.Number,
Name = student.Name,
Gender = student.Gender,
Birthday = student.Birthday,
ClassId = student.ClassId,
MajorId = student.Class.MajorId,
GradeId = student.Class.GradeId,
};
StudentViewModel selectListModel = GetSelectListModel();
model.Majors = selectListModel.Majors;
model.Grades = selectListModel.Grades;
return model;
}
在StudentController中创建Edit动作,代码如下:
public IActionResult Edit(Guid id)
{
StudentViewModel model;
try
{
model = studentService.GetEditModel(id);
}
catch (NullReferenceException)
{
return NotFound();
}
return View(model);
}
创建Edit.cshtml,代码如下:
@{
ViewBag.Title = "编辑学生";
}
@model StudentViewModel
<form method="post" class="mx-auto" style="width:320px;">
<div asp-validation-summary="All" class="has-text-danger mb-4"></div>
<input asp-for="Id" hidden>
<div class="field">
<label asp-for="MajorName" class="label"></label>
<div class="control">
<div class="select is-fullwidth">
<select asp-for="MajorId" asp-items="Model.Majors"
hx-get="/Student/GetClassSelectPartial"
hx-target="#ClassId"
hx-include="#GradeId,#ClassId"
hx-swap="outerHTML">
<option value="">请选择</option>
</select>
</div>
</div>
</div>
<div class="field">
<label asp-for="GradeName" class="label"></label>
<div class="control">
<div class="select is-fullwidth">
<select asp-for="GradeId" asp-items="Model.Grades"
hx-get="/Student/GetClassSelectPartial"
hx-target="#ClassId"
hx-include="#MajorId,#ClassId"
hx-swap="outerHTML">
<option value="">请选择</option>
</select>
</div>
</div>
</div>
<div class="field">
<label asp-for="ClassName" class="label"></label>
<div class="control">
<div class="select is-fullwidth">
<input asp-for="ClassId" hx-get="/Student/GetClassSelectPartial"
hx-trigger="load"
hx-include="#MajorId,#GradeId"
hx-swap="outerHTML">
</div>
</div>
</div>
<div class="field">
<label asp-for="Number" class="label"></label>
<div class="control">
<input asp-for="Number" class="input">
</div>
</div>
<div class="field">
<label asp-for="Name" class="label"></label>
<div class="control">
<input asp-for="Name" class="input">
</div>
</div>
<div class="field">
<label asp-for="Birthday" class="label"></label>
<div class="control">
<input asp-for="Birthday" class="input">
</div>
</div>
<div class="field">
<label asp-for="Gender" class="label"></label>
<div class="control">
<label class="radio">
<input type="radio" asp-for="Gender" value="false">
男
</label>
<label class="radio">
<input type="radio" asp-for="Gender" value="true" >
女
</label>
</div>
</div>
<div class="field">
<button class="button is-primary is-fullwidth">提交</button>
</div>
</form>
在StudentService中添加Update方法,代码如下:
public void Update(StudentViewModel model)
{
Student student = new()
{
Id = model.Id,
ClassId = model.ClassId,
Number = model.Number,
Name = model.Name,
Gender = model.Gender,
Birthday = model.Birthday,
};
studentRepo.Update(student);
}
和Add动作类似,只不过调用了Update方法,代码如下:
[HttpPost]
public IActionResult Edit(StudentViewModel model)
{
if (ModelState.IsValid)
{
try
{
studentService.Update(model);
return RedirectToAction("Index");
}
catch (DbUpdateException)
{
ModelState.AddModelError(nameof(Student.Number), "学号不能重复");
}
}
if (model.ClassId == Guid.Empty)
{
ModelState.Remove(nameof(Student.ClassId));
ModelState.AddModelError(nameof(Student.ClassId), "请选择班级");
}
StudentViewModel studentViewModel = studentService.GetSelectListModel();
model.Majors = studentViewModel.Majors;
model.Grades = studentViewModel.Grades;
return View(model);
}