接着上一篇文章,继续实现基于MVC的电影数据新增、删除和修改功能。
新增电影数据功能
直接复用之前项目中的新增页面(需要根据上一篇文章中的说明对页面内容进行微调)。点击首页中的新增数据链接时,其关联的URL是“https://localhost:5001/Movie/Create”,根据在StartUp文件的Configure配置的路由模板,程序应该请求调用MovieController中的Create函数处理,此时应该调用控制器中响应Get请求的Create函数,由于该页面是新增数据,不需要从首页中传递参数,因此控制器中的响应Get的新增函数Create没有输入参数。根据参考文献,控制器中的公开函数默认用于响应Get请求。函数比较简单,直接返回 View(),也即根据Views/Movie中的Create页面模板生成响应内容。如下图所示,用户在新建页面中填写数据。
页面编制好之后,点击Create按钮提交新增数据,此时form标签中的提交URL与之前在首页中的新增数据的URL相同,但是变成了post请求。为了在控制器类中区分名称相同的函数的响应类型,使用[HttpPost]特性标识函数响应post请求(响应相同请求的同名函数以函数签名区分)。如果数据类中的属性很多,新建时只想让用户填写其中的部分内容,可以使用Bind特性设置想要更改的属性(本项目中的电影类属性数量有限,不用Bind也可以)。在响应post请求的Create函数中,如果正常保存,则调用RedirectToAction函数跳转会首页。新增数据操作至此结束。
public IActionResult Create()
{
return View();
}
// POST: Movies/Create
[HttpPost]
public IActionResult Create([Bind("Id,Title,ReleaseDate,Genre,Price, Rating")] Movie movie)
{
if (ModelState.IsValid)
{
_context.Add(movie);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
删除电影数据功能
删除电影数据,其逻辑是先显示详情页,然后点击删除按钮删除数据,删除后返回主页面。由于需要显示详情页,在从主页面调用控制器类中响应Get请求的delete函数中须获取数据标识,即数据Id,同时在点击删除按钮时,也是调用控制器类中响应post请求的delete函数,同时传入要删除的数据Id。由于重载函数的函数签名不能重复,在项目中将响应post请求删除数据的函数命名为DeleteConfirmed,同时使用HttpPost和ActionName标识该函数响应action为Delete的post请求,这样就避免了函数签名重复。
public IActionResult Delete(int? id)
{
...
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
public IActionResult DeleteConfirmed(int id)
{
...
}
程序的操作截图如下所示,点击Delete按钮,删除数据后返回主页面,此时数据已被删除。
编辑电影数据功能
编辑电影数据的逻辑与删除数据类似,从主页跳转到编辑页面时,调用控制类中的编辑函数并传入数据Id,编辑完成后点击save按钮保存数据,后者的操作是调用控制器类中响应post请求的编辑函数,该函数的签名如下所示:
public IActionResult Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
开始比较纳闷,表单如何将这两个参数传递给函数,因为表单中的输入字段对应这电影类中的各个属性,没有多的内容。随后查看生成页面的源码(如下图所示),表单标签中的action链接中是包含了数据Id的,函数的输入参数应该一个来自表单action中的URL,另一个movie参数是程序将表单中的字段转换为movie对象。
在测试编辑函数时还碰到一个问题(折腾了两天才发现原因),函数声明中使用Bind限定了Movie类中的哪些属性可以编辑,其中也包括Id,Id在表单中(如上图所示)被设置为隐藏,其值设置为待编辑数据的Id,按理说表单提交时应该可以把Id值赋予movie对象并传递给编辑函数,但是在测试过程中发现编辑函数接收的movie对象中Id始终为0,程序也没有报错,折腾了很久也没有找到原因。后来发现是函数声明中Bind中指定的Id属性名称写错了,由Id变成了ID(微软的示例程序中是ID,我测试过程中修改成了Id,但是测试程序时没有改过来),将Bind中的属性名称修改为与Movie类属性名称相同后,问题解决。这里很容易出错,也不容易找出问题。
程序的编辑操作截图如下所示,点击Save按钮,更新数据后返回主页面,此时数据已被修改。
本文实现了基于ASP.NET Core MVC的数据新增、删除、编辑功能,后续还会继续根据微软的教程及示例项目学习ASP.NET Core MVC开发基本知识。
参考文献:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-mvc-app/controller-methods-views?view=aspnetcore-5.0