ASP.NET Core中的 HttpPost Edit 操作方法

admin
admin
2021-06-03
分享:

本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP)
本文出自《从零开始学 ASP.NET Core 与 EntityFramework Core》目录
视频课程效果更佳:跨平台开发实战掌握 ASP.NET Core 与 EntityFramework Core

完成 HttpPost 的 Edit 操作方法

在本章节中,我们希望实现响应 HttpPost 的 Edit 操作,来更新我们的学生信息。

当我们单击更新按钮的时候,我们会拦截和处理表单数据然后发布到服务器上。

edit

Post 请求的 Edit 操作方法

请看以下代码,我们已经在必要的地方添加了解释代码。

//通过模型绑定,作为操作方法的参数
       //StudentEditViewModel 会接收来自Post请求的Edit表单数据
        [HttpPost]
        public IActionResult Edit(StudentEditViewModel model)
        {

           //检查提供的数据是否有效,如果没有通过验证,需要重新编辑学生信息
           //这样用户就可以更正并重新提交编辑表单
            if (ModelState.IsValid)
            {
               //从数据库中查询正在编辑的学生信息
                Student student = _studentRepository.GetStudent(model.Id);
               //用模型对象中的数据更新student对象
                student.Name = model.Name;
                student.Email = model.Email;
                student.Major = model.Major;

               //如果用户想要更改照片,可以上传新照片它会被模型对象上的Photo属性接收
               //如果用户没有上传照片,那么我们会保留现有的照片信息

                if (model.Photo != null)
                {
                  //如果上传了新的照片,则必须显示新的照片信息
                  //因此我们会检查当前学生信息中是否有照片,有的话,就会删除它。
                    if (model.ExistingPhotoPath != null)
                    {
                        string filePath = Path.Combine(hostingEnvironment.WebRootPath,
                            "images", model.ExistingPhotoPath);
                        System.IO.File.Delete(filePath);
                    }

                   //我们将保存新的照片到 wwwroot/images  文件夹中,并且会更新
                   //Student对象中的PhotoPath属性,然后最终都会将它们保存到数据库中
                  student.PhotoPath = ProcessUploadedFile(model);
                }

               //调用仓储服务中的Update方法,保存studnet对象中的数据,更新数据库表中的信息。
                Student updatedstudent = _studentRepository.Update(student);

                return RedirectToAction("index");
            }

            return View(model);
        }

以下是私有方法 ProcessUploadedFile()的作用说明,该方法是将照片保存在wwwroot/images文件夹中,并且返回唯一的文件名。然后我们将此文件名赋值到 student 对象中的 PhotoPath 属性中,该值最后会保存到数据库中。


       ///<summary>
       ///将照片保存到指定路径中,并返回唯一的文件名
       ///</summary>
       ///<param name="model"></param>
       ///<returns></returns>
        private string ProcessUploadedFile(StudentCreateViewModel model)
        {
            string uniqueFileName = null;

            if (model.Photo != null)
            {
                string uploadsFolder = Path.Combine(hostingEnvironment.WebRootPath, "images");
                uniqueFileName = Guid.NewGuid().ToString() + "_" + model.Photo.FileName;
                string filePath = Path.Combine(uploadsFolder, uniqueFileName);
                using (var fileStream = new FileStream(filePath, FileMode.Create))
                {
                    model.Photo.CopyTo(fileStream);
                }
            }

            return uniqueFileName;
        }

文章说明

如果您觉得我的文章质量还不错,欢迎打赏,也可以订阅我的视频哦
未得到授权不得擅自转载本文内容,52abp.com 保留版权
感谢您对我的支持

关注微信公众号:角落的白板报

公众号:角落的白板报