Razor 语法
典型的内容页面包含 静态HTML、辅助标签、C#代码。
所有代码块必须放置在@{ ... }中,遇到@,会被认为开始写C#代码。。。
迭代或选择语句(if, for , foreach, switch, while etc)的关键字使用@即可。try ... catch也是使用@即可。
如果要渲染单行语句的结果,使用@( ... )。
如果要包含带@的内容,如邮箱地址,需要使用两个@,如:
For support, contact support@@domain.com
<text>标签不会被浏览器渲染。
注释一行: //
注释多行:/* ... */
@*....... *@
页面模型
页面模型用于分割用户界面层(.cshtml视图文件)和逻辑处理层。这样做的好处:
- 降低用户界面层的复杂的,便于维护
- 方便自动化单元测试
- 便于不同项目组成员分工协作,一个人做视图层,另一个人做逻辑层
- 便于创建小的,可复用的代码单元
页面模型类在创建新项时选择Razor页面(和页面模型一起)时创建。
页面模型类和页面在同一个命名空间内,页面模型类是控制器和视图模型的结合。
控制器
Razor 页面模型类采用页面控制器模式,特征是页面和控制器是一一对应的。控制器的作用是从页面请求接收输入,然后选择正确的视图给输出页面。
视图模型
默认模板
Index.cshtml
@page
@model IndexModel
@{
}
Index.cshtml.cs
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace LearnRazorPages.Pages { public class IndexModel : PageModel { public void OnGet() { } } }
页面模型通过@model指令在页面中可用,页面模型继承自Microsoft.AspNetCore.Mvc.RazorPages.PageModel,继承许多与HTTP请求相关的属性,如HttpContext,Request,Response,ViewData,ModelState和TempData,也继承一些用于指定返回结果类型的方法。
请求处理流程
页面模型中的请求处理与MVC控制器中行为方法类似。OnGet 或 OnGetAsync方法用于GET请求,OnPost 或 OnPostAsync方法用于POST请求。如果要创建完整的REST-ful应用,其他HTTP方法(PUT、DELETE)也支持。
匹配算法仅仅考虑方法的名称,与返回类型及参数无关。唯一的约定是方法修饰符必须是Public。
属性和方法
页面模型中的属性和方法在Razor页面的Model属性中可访问,属性可以是简单的,如string,int,DateTime等,也可以是复杂的class或复合体。例如,在页面中向数据库添加新的产品,可能用如下属性:
public string Name { get; set; } public SelectList Categories { get; set; } public int CategoryId { get; set; }
也可以增加属性或方法,用于为页面格式化数据,降低Razor页面的代码量。下面示例展示如何用属性格式化计算结果:
public List<OrderItems> Orders { get; set; } public string TotalRevenue => Orders.Sum(o => o.NetPrice).ToString("f");
这样在Razor页面中只需@Model.TotalRevenue即可显示两位小数的全部销售额。