编辑班级

添加GetEditModel方法

在进入编辑视图前,不仅需要获取下拉列表的数据,还需要通过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动作

Edit动作需要通过Id指定具体要修改哪一个班级的数据,如果找到此班级,则返回视图模型给视图,否则返回404状态码。

代码如下:

public IActionResult Edit(Guid id)
{
    ClassViewModel model;
    try
    {
        model = classService.GetEditModel(id);
    }
    catch (NullReferenceException)
    {
        return NotFound();
    }
    return View(model);
}

创建Edit视图

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>

添加Update方法

在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);
}

创建post请求的Edit动作

和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);
}