.NET Core + Razor-增、删、改、查

作者:vkvi 来源:ITPOW(原创) 日期:2021-12-27

大多数业务系统中,干得最多的,就是增、删、改、查。

数据列表

以 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 部分语法

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 等元素、属性的颜色都不一样了。

没加:

asp-for 不起作用

加了:

@addTagHelper

加了后,我们会发现生成的 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 时,提交时,默认是禁止 <> 这类符号的,这里有此限制吗?

没有。那玩意本身就是杯弓蛇影,根本没必要禁止。

相关文章