在进入编辑视图前,不仅需要获取下拉列表的数据,还需要通过Id获取班级的数据。
代码如下:
public ClassViewModel GetEditModel(Guid id)
{
Class? @class = classRepo.Get(id);
if (@class == null)
{
throw new NullReferenceException();
}
ClassViewModel model = new ClassViewModel()
{
Id = @class.Id,
MajorId = @class.MajorId,
GradeId = @class.GradeId,
Name = @class.Name,
};
ClassViewModel selectListModel = GetSelectListModel();
model.Majors = selectListModel.Majors;
model.Grades = selectListModel.Grades;
return model;
}
由于获取下拉列表模型的方法已经存在,因此可以直接调用。
Edit动作需要通过Id指定具体要修改哪一个班级的数据,如果找到此班级,则返回视图模型给视图,否则返回404状态码。
代码如下:
public IActionResult Edit(Guid id)
{
ClassViewModel model;
try
{
model = classService.GetEditModel(id);
}
catch (NullReferenceException)
{
return NotFound();
}
return View(model);
}
Edit视图和Add视图几乎相同,只需要修改标题,以及添加一个Id属性的input标签即可。
代码如下:
@{
ViewBag.Title = "编辑班级";
}
@model ClassViewModel
<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"></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"></select>
</div>
</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">
<button class="button is-primary is-fullwidth">提交</button>
</div>
</form>
在Service中将视图模型转换为模型并插入到数据库中。
代码如下:
public void Update(ClassViewModel model)
{
Class @class = new Class
{
Id = model.Id,
MajorId = model.MajorId,
GradeId = model.GradeId,
Name = model.Name
};
classRepo.Update(@class);
}
和Add动作类似,只是将Insert方法替换成Update方法。
代码如下:
[HttpPost]
public IActionResult Edit(ClassViewModel model)
{
if (ModelState.IsValid)
{
classService.Update(model);
return RedirectToAction("Index");
}
ClassViewModel selectListModel = classService.GetSelectListModel();
model.Majors = selectListModel.Majors;
model.Grades = selectListModel.Grades;
return View(model);
}