大多数业务系统中,干得最多的,就是增、删、改、查。
数据列表
以 Cat 为例。
Models 文件夹下建一 Cat.cs
namespace WebApplication1.Models; public class Cat { public int Id { get; set; } public string Name { get; set; } = ""; }
命名空间直接以分号结束,不用大括号括起来,表示作用于本页。
Pages 文件夹下建一 List.cshtml
页面模型:
public class ListModel : PageModel { public List<Cat> Cats { get; set; } public IndexModel() { Cats = new List<Cat>(); Cats.Add(new Cat() { Id = 1, Name = "黑猫" }); Cats.Add(new Cat() { Id = 2, Name = "白猫<b>b</b>" }); } }
Razor 页面:
@page @model WebApplication1.Pages.ListModel <table> <tr> <th>Id</th> <th>Name</th> </tr> @foreach (var cat in Model.Cats) { <tr> <td>@cat.Id</td> <td><a href="Details?catId=@cat.Id">@cat.Name</a></td> </tr> } </table>
网址中输入 List 访问,呈现效果:
Razor 部分语法
Razor 嵌入更自由、完全混合、自动识别。也不像 Web Forms 中什么属性中不能混合嵌套,什么要放在 form 标签中,这里都不是事儿。
默认不需要额外操心 HtmlEncode
如果我就要原始输出咋办?我不让你给我转码。用 @Html.Raw,如下:
@Html.Raw(cat.Name)
@ 是特殊字符,如果真要输出 @,那就打 2 个 @,以转义
邮箱地址不必打 2 个 @,不过要打也可以。
多行代码可考虑使用大括号括起来
上面的 @foreach 实际是一行语句,如果有多行,使用大括号,如下,输出的内容是:ab。
@{ string s = ""; s += "a"; s += "b"; @s; }
至此,我们已经知道 Razor 实际上是 Razor、C#、HTML 等混合书写。
更多请参见:ASP.NET Core 的 Razor 语法参考 | Microsoft Docs。
创建(修改)数据
Pages 文件夹下建一 Create.cshtml
页面模型:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using WebApplication1.Models; namespace WebApplication1.Pages { public class CreateModel : PageModel { public Cat Cat { get; set; } public CreateModel() { Cat = new Cat(); } public void OnPost() { if (!ModelState.IsValid) { return; } Cat.Id = 3; Cat.Name = Request.Form["Cat.Name"]; // ... } } }
OnPost 是 Post 方法时执行的,类似还有 OnGet。
ModelState.IsValid 用来验证状态是否有效,防止跨站点攻击。
Razor 页面:
@page @model WebApplication1.Pages.CreateModel @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers <form method="post"> @Html.AntiForgeryToken() <div>名称:<input asp-for="Cat.Name" /></div> <div><input type="submit" value="提交" /></div> </form>
@Html.AntiForgeryToken() 是为了防止跨站点攻击用的,如果删除,提交时可能会遇到找不到网页的情况。
asp-for 如果不起作用,可能是漏掉了:@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers。加上后,你会发现 form 等元素、属性的颜色都不一样了。
没加:
加了:
加了后,我们会发现生成的 input 代码是这个样子:
<input type="text" data-val="true" data-val-required="The Name field is required." id="Cat_Name" name="Cat.Name" value="" />
id、name 给我们加上了,还有一些 jQuery 方面的也给我们加上了(这里不说这个)。
请参见:ASP.NET Core 中的标记帮助程序 | Microsoft Docs。
或者你想说,我不用 asp-for,我自己指定 name 可不可以呢?
当然可以了。
我记得 ASP.NET Web Forms 时,提交时,默认是禁止 <> 这类符号的,这里有此限制吗?
没有。那玩意本身就是杯弓蛇影,根本没必要禁止。