第三篇 Asp.Net Core Razor Pages介绍
前言 要熟练使用Core平台开发项目,必先熟悉一种新的Webs页面即Razor Pages,Razor Pages是一种包含C#代码的web页面,服务后端包含Models,前端包含C#,相当于简化了Controllers的MVC Views页面。
Razor Pages页面特点如下:
1,文件名首位不能是下划线
2,文件扩展名为.cshtml
3,文件的第一行是 @page
4,Razor代码块被@{ }包裹,内部为标准C#代码。
5,PageModel,推荐使用页面模型,页面模型通过 @model 模型名称 引入页面中。
学些目标:
1,创建Razor Pages 项目、了解常用的Nuget包
2,了解Razor Pages基本的页面组成
3,与Sqlserver数据库交互完成CRUD操作
4,Razor Pages搜索、验证等操作。
准备工具:
Vs2017以上的版本和Sqlserver2008以上版本
一、创建Razor Pages
在Vs中新建一个项目名称为RazorPages项目,项目类型选择“Asp.Net Core Webs应用”,目标框架选择“.Net Core 3.1”。
Core下基本的Razor Pages框架目录如下,页面默认在Pages文件夹里,wwwroot文件夹存储Css和Js页面样式文件,“appsettings.json”为生成部署文件,“Program.cs”中的main函数是主程序的入口,“Startup.cs”中配置Sql连接,路由注册服务等后面会详细讲到,(关注@高山流水学编程不迷路)
Razor Pages页面内容格式如下:
@page @model IndexModel @{ ViewData["Title"] = "Home page"; } <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p> </div>
二、为Razor添加Models模型,模型类名称为UserData。操作步骤:右键点击解决方案“RazorPages”,添加Models文件夹,然后右键点击“Models”文件夹添加一个“UserData.cs”的类文件,如下图所示。
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Threading.Tasks; namespace RazorPages.Models { public class UserData { [Key, Column(Order = 1)] public int UserId { get; set; } public string UserName { get; set; } public string Password { get; set; } } }
三、使用Vs实体框架生成Razor页面(CRUD)
首先右键点击Pages文件夹,在它下面添加一个“Users”文件夹,右键点击“Users”,依次点击“添加”->“新搭建基架的项目”->"使用实体框架生成Razor Pages页面(CRUD)"
选择模型类
注意在生成的结果中报错,提示缺少依赖的NuGet包可以点击通过右键点击“项目资源”,“”管理NuGet程序包”来添加。在右侧选择安装,安全前注意选择对应的版本,比如:Core3.1选择Sql数据包版本最好选择3.0,详细官网有介绍。
常用的几个NuGet数据包如下:
Microsoft.EntityFrameworkCore.SqlServer(选择版本:V3.0) ==> Sqlserver数据库连接使用
Microsoft.EntityFrameworkCore.Tool(选择版本:V3.0) ==> 完成Sqlserver数据CRUD
EntityFramework.SqlServerCompact (选择版本:V4.1) ==> Sqlserver数据库操作和交互
下面是非常重要的三步:一是在Startup.cs中注册如下ConfigureServices的服务(如果系统已生成,不用添加),二是在appsettings.json文件中添加Sqlserver数据库连接字符串。如下所示
注意:Startup.cs中“GetConnectionString("MVCSqlContext")”方法名称与appsettings.json中的ConnectionStrings": {"MVCSqlContext": }名称一致。
public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddDbContext<RazorPagesContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MVCSqlContext"))); }
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", "ConnectionStrings": { "MVCSqlContext": "Server=localhost;Database=InfoUser;User ID=sa;Password=sa;" } }
第三步,在Startup.cs文件中添加Users路由路径
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using RazorPages.Data; namespace RazorPages { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddDbContext<RazorPagesContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MVCSqlContext"))); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } } }
生成解决方案后,点击“”在浏览器中运行程序,在网址后面输入Users,运行节目如下:
四、Razor Pages页面验证
在Models下面UserData.cs类,给可以给每一个方法加一个限制,即页面的验证属性。代码如下:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Threading.Tasks; namespace RazorPages.Models { public class UserData { [Key, Column(Order = 1)] //指定为主键 [Display(Name = "编号")] //字段名重命名 public int UserId { get; set; } [StringLength(60, MinimumLength = 3)] //验证长度大于3,小于60 [Required] public string UserName { get; set; } [RegularExpression(@"^[A-Z0-9]{6}$")] //验证输入项为大写字母或数字组成的6位数 [Required] //必填项 public string Password { get; set; } } }
---------------Razor语法大全(以下内容来源与网络 原创:https://www.cnblogs.com/dengxinglin/p/3352078.html)-------------
Razor语法大全
本文页面来源地址:http://www.cnblogs.com/dengxinglin/p/3352078.html
Razor是基于framewor4以上写的一个开源项目:https://github.com/Antaris/RazorEngine/
Razor是包含了模板引擎和动态编译两部分。本部分就简单记录了模板引擎的一些语法,之后用Razor做一个代码生成器,就使用Razor的语法来。
Razor的发布是和MVC一起的,作为MVC的视图模板引擎。
Razor文件类型
Razor可以在vb.net和C#中使用。分别对应了两种文件类型,.vbhtml和.cshtml
Razor的标识符
@字符被定义为Razor服务器代码块的标识符,后面的表示是服务器代码了。web form中使用<%%>中写服务器代码一个道理。在vs工具里面提供了代码着色和智能感应的功能。如下面代码:
@{string userName= "邓星林";} <span>@userName</span> <span>@DateTime.Now.ToString("yyyy-MM-hh")</span>
Razor的作用域
在上面一个例子中都已经使用到了大括号{},不错,大括号里面的就是表示作用域的范围,用形如@{code}来写一段代码块。
@{ string userName= "邓星林"; @userName }
在作用域(代码块)中输出也是用@符号的。
用Razor和html代码混合编写
在Razor中写html代码和html代码中写Razor语句都是可以的,并且还有智能提示。
a.在作用域内如果是以html标签开始则视为文本输出
b.如果要输出@,则使用@@
c.如果要输出非html标签和非Razor语句的代码,则用@:,他的作用是相当于在处于html下面编写一样了,如在@:后面可以加上@就是表示Razor语句的变量
如:
@{ var str = "abc"; ////下面会输出:this is a mail:dxl0321@qq.com, this is var: abc,this is mail@str,this is @; @: this is a mail:dxl0321@qq.com, this is var: @str,this is mail@str,this is @@; //下面输出abc @str }
Razor作用块注释
razor作用块里面本身就是服务器代码了,因此可使用服务器代码的注释,注释有//和/**/分别是单行注释和多行注释。
另外razor注释还可以使用自身特有的@* 注释的内容 *@,支持单行和多行的。
@{ @* 多行注释 多行注释 *@ var i = 10; @* asdfasf *@ }
Razor类型转换
As系列扩展方法和Is系列扩展方法
AsInt(), IsInt()
AsBool(),IsBool()
AsFloat(),IsFloat()
AsDecimal(),IsDecimal()
AsDateTime(),IsDateTime()
ToString()
@{ var i = “10”; } <p> i = @i.AsInt() </p> <!-- 输出 i = 10 -->
razor其它
@Href("~/")//表示网站的根目录
@Html.Raw(Module.Content) 输出HTML,如:@Html.Raw('<font color='red'>红字</font>'),就会显示出红色的”红字“,不用的话会直接显示这段html字符串(<font color='red'>红色文字</font>)
在实际中,比如一个网站,整过框架是一样的,而有的地方是很多相同的版块。因此我们需要复用。
布局(Layout)
layout方式布局就是相当于一个模板一样的,我们在它地址地方去添加代码。相当于定义好了框架,作为一个母版页的,在它下面的页面需要修改不同代码的地方使用@RenderBody()方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> <title>我的网站 - @Page.Title</title> </head> <body> @RenderBody() </body> </html>
@{ Layout = "/LayoutPage.cshtml"; Page.Title = "测试页面哦"; } <p>This is a layout test</p>
页面(Page)
page是当需要在一个页面中,输出另外一个razor文件的内容时候用到,比如头部或者尾部这些公共的内容时候需要用到。输出就使用 @RenderPage()方法
如:A页面中也要把B页面的内容输出
A页面:
<p> @RenderPage("/b.cshtml") </p>
b页面的代码如下:
<font color="red">这是一个子页面</font>
Section区域
Section是定义在Layou的中使用的。在Layout的页面中用。在要Layout的父页面中使用@RenderSection("Section名称 ")
定义:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> <title>我的网站 - @Page.Title</title> </head> <body> @RenderSection("SubMenu") @RenderBody() </body> </html>
在它的子页面中使用
@section SubMenu{ Hello This is a section implement in About View. }
如果在子页面中没有去实现了SubMenu了,则会抛出异常。我们可以它的重载@RenderSection("SubMenu", false)
@if (IsSectionDefined("SubMenu")) { @RenderSection("SubMenu", false) } else { <p>SubMenu Section is not defined!</p> }
Helper
helper就是可以定义可重复使用的帮助器方法,不仅可以在同一个页面不同地方使用,还可以在不同的页面使用。
如在cshtml中那么写:
@helper sum(int a,int b) { var result=a+b;
@result } <div > <p>@@helper的语法</p> <p>2+3=@sum(2,3)</p>
<p>5+9=@sum(5,9)</p>
</div>
我们通常会把一类Helper放在一个单独的cshtml文件中,而文件名就相当于一个类名。
我把sum放在HelpMath.cshtml文件中,则我们在那上面cshtml中的使用方法是:
<p>2+3=@HelpMath.sum(2,3)</p> <p>5+9=@HelpMath.sum(5,9)</p>
另外,系统还为我们提供了一些列的Helper,用来简化Html的书写。这些Helper放在@Html中,我们可以方便的使用:
<p> @Html.TextBox("txtName") </p>