Asp.NET Core进阶 第三篇 Asp.Net Core Razor Pages介绍

   

第三篇  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>
posted @ 2021-11-25 23:50  高山流水学编程  阅读(996)  评论(0编辑  收藏  举报