前一篇文章《VSCode创建连接mysql的ASP.NET Core项目》介绍了如何在VSCode中创建ASP.NET Core Web项目、连接mysql数据库,但项目最后只是将数据库中的数据读出来,然后以列表形式展示在页面上。本文继续该项目,参照微软ASP.NET Core教程中提供的示例代码(参考文献2),继续增加新建、编辑、删除、查看明细功能。
先分享一个VSCode的技巧,原来一直不知道在终端运行了dotnet run之后怎么停止,之前一直都是新建一个终端,这两天才发现,可以按ctrl+c来停止。
首先根据教程及个人理解介绍项目结构,如下图所示。
从上往下大概介绍一下每个文件夹及重要文件的意义:
- .vscode:用于保存和设置与VSCode运行及调试相关的参数,详细的介绍请查看参考文献3-4;
- bin:保存项目编译后的文件;
- Models:该文件夹是手动添加的文件夹,用于保存与数据库表对应的数据类,同时为了简单起见,把数据库连接类(RazorPagesMovieContext)也放在了该文件夹内,微软提供的示例中是将其放在了单独的Data文件夹中;
- Pages:保存项目中的所有页面,其中Shared文件夹中保存的是共用的页面,其中的_Layout.cshtml 相当于所有页面通用的页面;
- wwwroot:包括项目中使用的css文件、JavaScript文件及依赖项等;
- appsettings.json:保存项目相关参数配置,有点类似与.net framework中winform项目的app.settings文件;
- program.cs:项目的入口点,main函数即在该文件中;
- startup.cs:感觉有点像项目的初始化配置类,可以配置项目的数据库类、日志、路由等各方面的内容;
- TestWebMySql.csproj:项目文件,可以配置项目的依赖项、运行时版本等。
项目中的页面称为Razor 页面,其包含两个文件:cshtml 文件和.cshtml.cs 文件,前者用于设置页面中的显示内容及格式,后者包含处理页面事件的C#代码。感觉Razor页面有点类似于Winform界面,包含有designer文件和对应的代码文件。
.cshtml.cs中的类继承自PageModel,主要处理页面中的onget、onpost等事件,这跟之前学习的JSP不太一样,JSP页面中内嵌Java代码,可以直接在页面中嵌入大量代码,也可以JSP结合Servlet,减少JSP文件中的代码,将操作放在Servilet中。
cshtml 文件中内置Razor语法,它与Pages/Shared中的_Layout.cshtml 结合起来才算是一个完整的页面。cshtml文件中的内容主要放在_Layout.cshtml 中的 RenderBody区域。
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
接下来介绍在项目中增加新建、编辑、删除、查看明细功能,其实是参考微软的示例项目,将其中对应的功能页面复制到项目中,然后做适应性的调整。
首先是新建功能,项目的主页面是Pages/Index.cshtml,目前其中主要包含一个表格,在该表格下增加指向新建电影条目的链接,然后将微软示例项目中的Create相关页面复制到Pages/Movies文件夹下。
<p>
<a asp-page="./Movies/Create">创建新的电影条目</a>
</p>
新建页面主要是用户输入信息,然后提交到数据库,相应的Create.cshtml.cs中主要处理页面的onpost事件,将页面提交的各个字段自动映射并创建Movie对象,然后保存到数据库,如下面代码所示。页面中各字段与Movie类属性的对应关系、验证方式是通过页面中的asp-for、asp-validation-for等进行配置的(还在学习中,对这些标签的含义不是太明白,有疑问请查看参考文献1)。数据保存成功后,调用RedirectToPage函数跳转到项目主页面。
if (!ModelState.IsValid)
{
return Page();
}
_context.Movies.Add(Movie);
await _context.SaveChangesAsync();
return RedirectToPage("../Index");
在项目主页面列表中增加一列,用于显示编辑、查看明细、删除等页面链接(这三个页面也是从微软的示例项目中复制过来的),其中asp-page用于设置要跳转的页面,asp-route-id指定传入到该页面的参数(形式为asp-route-{value},具体介绍请查看参考文献7-8),这两个结合起来能够产生最终的页面跳转地址。
<td>
<a asp-page="./Movies/Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-page="./Movies/Details" asp-route-id="@item.Id">Details</a> |
<a asp-page="./Movies/Delete" asp-route-id="@item.Id">Delete</a>
</td>
同时编辑、查看明细、删除的页面都是以@page "{id:int}"开头,用于接收传过来的参数。
编辑页面主要是显示已有数据及保存修改后的数据,因此其cshtml.cs文件中主要响应onget、onpost函数,onget函数根据页面传入的id获取数据库中对应的对象,然后根据页面配置显示各字段内容,用户修改完成点击提交按钮,onpost函数将修改后的数据保存到数据库,最后跳转回项目主页面。页面大致如下:
查看明细页面主要是显示已有数据,因此其cshtml.cs文件中主要响应onget函数,onget函数根据页面传入的id获取数据库中对应的对象,然后根据页面配置显示各字段内容,页面大致如下:
删除页面主要是显示待删除数据及删除数据,因此其cshtml.cs文件中主要响应onget、onpost函数,onget函数根据页面传入的id获取数据库中对应的对象,然后根据页面配置显示各字段内容,用户点击提交按钮,onpost函数删除数据库中指定Id的数据,最后跳转回项目主页面。页面大致如下:
本文介绍了基于微软教程及示例程序开展的ASP.NET Core Web项目学习情况,由于初学,有些内容理解不够或者理解有误,后续还会继续深入学习。
参考文献:
[1]https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/razor-pages-start?view=aspnetcore-5.0&tabs=visual-studio
[2]https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/tutorials/razor-pages/razor-pages-start/sample/RazorPagesMovie50
[3]https://blog.csdn.net/wangbeibei23/article/details/106307886
[4]https://blog.csdn.net/V__KING__/article/details/109407846?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-4&spm=1001.2101.3001.4242
[5]https://www.cnblogs.com/liulun/p/7904602.html
[6]https://blog.csdn.net/weixin_30817749/article/details/96678853
[7]http://blog.baibaota.com/337.html
[8]https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/built-in/anchor-tag-helper?view=aspnetcore-5.0#asp-route-value