典型的内容页面包含 静态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即可显示两位小数的全部销售额。