RazorPage是一种基于页面的编码方式,属于ASP.NET Core MVC的一个轻量级的分支。它非常适合页面信息流等之类的需求。注意,RazorPage要求使用.NET Core 2.1 SDK 或更高版本。
构建第一个RazorPage应用
dotnet new webapp -o RazorPagesMovie cd RazorPagesMovie dotnet run
支持Razor标记语法
<p>@DateTime.Now</p> <p>@DateTime.IsLeapYear(2016)</p>
<p>@await DoSomething("hello", "world")</p>
<p>Last week this time: @(DateTime.Now - TimeSpan.FromDays(7))</p>
<p>@(GenericMethod<int>())</p>
@("<span>Hello World</span>")
<span>Hello World</span>
HtmlHelper.Raw 输出不进行编码,但呈现为 HTML 标记。
Razor 代码块以 @ 开头,并括在 {} 中。 代码块内的 C# 代码不会呈现,这点与表达式不同。 一个视图中的代码块和表达式共享相同的作用域并按顺序进行定义。
若要定义应呈现 HTML 的代码块子节,请使用 Razor <text> 标记将要呈现的字符括起来:
@for (var i = 0; i < people.Length; i++) { var person = people[i]; <text>Name: @person.Name</text> }
@for (var i = 0; i < people.Length; i++) { var person = people[i]; @:Name: @person.Name }
内置路由
默认根据Pages文件夹里的页面名称自动适配。比如About.cshtml对应的路由为/About,支持参数查询。
<a asp-page="./About" asp-route-id="@item.ID">Details</a>上述代码会在 Razor 文件中参与创建和呈现 HTML 元素。包括 Razor 页面(路由是相对的)、asp-page 和路由 ID (asp-route-id) 动态生成 HTML href 特性值。
数据访问
通过依赖关系注入进行生成,EF Core 数据库上下文在应用程序启动期间通过依赖关系注入进行注册,RazorPage通过构造函数提供相应服务。
先在ConfigureServices中注入数据上下文。
services.AddDbContext<SchoolContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
然后在Page构造函数中获取数据上下文进行数据访问操作。
public AboutModel(SchoolContext context) { _context = context; }
编程模式
默认是异步编程,可以更有效地利用服务器资源。也支持使用同步编程。
在 EF Core 中只会异步执行导致查询或命令被发送到数据库的语句。 这包括 ToListAsync、SingleOrDefaultAsync、FirstOrDefaultAsync 和 SaveChangesAsync。 不包括只会更改 IQueryable 的语句,例如 var students = context.Students.Where(s => s.LastName == "Davolio")。
EF Core 上下文并非线程安全,请勿尝试并行执行多个操作。
钩子函数
OnGet/OnGetAsync:初始化页面所需的任何状态。
OnPost/OnPostAsync:表单提交处理方法。
除了默认的钩子函数,还可以通过asp-page-handler指定自定名称的钩子函数。
<form method="POST"> <div>Username: <input asp-for="username" /></div> <input type="submit" value="Search" asp-page-handler="Search" class="btn btn-primary btn-xs" /> </form>上述表单将通过.cshtml.cs 文件代码中OnPostSearch()/OnPostSearchAsync()钩子函数来处理。
参数处理
将参数传递给处理方法有两种方法:表单输入、表单元素借助 asp-route Tag Helper。
对于表单输入作为输入参数,名称必须是同步的。表单元素的名称必须与处理方法参数的名称相匹配。
<form method="POST"> <input type="text" name="query"/> <button type="submit" asp-page-handler="Search">Search</button> </form>对应的处理方法如下:
public async Task OnPostSearchAsync(string query) { //do somethings }
第二种是通过路由发送参数。
<form method="POST" asp-page-handler="Delete" asp-route-id="id"> <button>Delete</button> </form>