ASP.NET Core教程【一】关于Razor Page的知识

关键文件和目录结构

按照asp.net core WEB应用程序向导,创建一个工程之后

你会发现如下几个目录和文件

  • wwwroot:放置网站的静态文件的目录
  • Pages:放置razor页面的目录
  • appsettings.json:是应用的配置文件
  • bower.json:静态资源包管理的配置文件
  • Program.cs:这个程序负责承载ASP.NET Core应用
  • Startup.cs:初始化service的配置,初始化请求管道

下面我们单独说一下Pages目录

_Layout.cshtml 是整个网站的母板文件,

除了在这里写布局页面的代码外,

你还可以把一些基础的样式和脚本放在这里,

_ViewStart.cshtml 负责设置所有Razor页面都会用到的Layout属性,

_ViewImports.cshtml 负责设置所有页面都会用到的指令,比如引入什么类库等

_ValidationScriptsPartial.cshtml 负责引用验证脚本,比如jquery的validation组件

数据库链接字符串放在哪儿

在appsettings.json文件中,你可以防止数据库链接字符串,比如这样:

 {
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "MovieContext": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

ConnectionStrings就是数据库链接字符串;

在Startup中依赖注入数据库链接上下文对象

在Startup.cs文件中,有一个ConfigureServices方法,你可以通过依赖注入的方式,加载数据库连接上下文,比如这样:

public void ConfigureServices(IServiceCollection services)
{
    // 需要引用如下两个类库
    // using RazorPagesMovie.Models;
    // using Microsoft.EntityFrameworkCore;

    services.AddDbContext<MovieContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("MovieContext")));
    services.AddMvc();
}

说明:这里用到了Microsoft.EntityFrameworkCore,要先通过nuget包管理器,引入包,相关内容不作赘述;

接下来你就可以写实体,完成相应数据的增删改查了;

数据库表结构同步工具

往往我们写了实体类型,还需要把实体类型做成数据库结构,非常麻烦

这里你可以用microsoft.visualstudio.web.codegeneration.design,这个包来完成相应的工作,相关的命令如下:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design -Version 2.0.0
Add-Migration Initial
Update-Database

第一行是安装这个工具包;

第二行是根据DbContext所引用的实体类,生成数据库表结构的同步代码;

第三行是更新数据库;

这个工具包是不是只支持EF,还有待考察。

Razor页面的PageModel类

好,我们现在看看怎么通过数据库上下文把数据从数据库中拿出来

在Pages目录下,创建一个Razor页面

在相应的cshtml.cs文件中,撰写如下代码:

using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Threading.Tasks;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Pages.Movies
{
    public class IndexModel : PageModel
    {
        private readonly RazorPagesMovie.Models.MovieContext _context;

        public IndexModel(RazorPagesMovie.Models.MovieContext context)
        {
            _context = context;
        }

        public IList<Movie> Movie { get;set; }

        public async Task OnGetAsync()
        {
            Movie = await _context.Movie.ToListAsync();
        }
    }
}

说明:Movie是与数据库表结构对应的实体类;

Razor页面继承自PageModel类,按照约定,类名遵从[PageName]Model这样的命名方式

构造函数通过依赖注入获得数据库访问上下文实例;

关于Razor Page的页面代码

我们再来看看.cshtml文件的代码:

@page
@model RazorPagesMovie.Pages.Movies.IndexModel

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>
    <a asp-page="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Movie[0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movie[0].Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movie[0].Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model.Movie) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Genre)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Razor引擎可以把上面这些HTML代码转成C#代码或者转成Razor过度代码;

当一个 @ 符号后面跟的是Razor保留关键字的话,他会被转义成Razor过度代码,否则会被转义成C#代码;

这是在编译期完成的工作,所以不会影响运行期的执行效率;

关于page指令

@page指令使得这个页面变成了一个ASP.NET MVC的Action

这个指令必须是在Razor Page的第一个指令

关于违法访问的处理

来看看下面这行代码:

@Html.DisplayNameFor(model => model.Movie[0].Title))

这行代码的特殊之处在于,不会存在违法访问的异常,

也就是说model, model.Movie 和model.Movie[0] 的值是 null 或者empty时,不会报异常;

关于model指令

@model RazorPagesMovie.Pages.Movies.IndexModel

这个指令使得cshtml.cs文件中的IndexModel类,在这个Razor Page中有效

关于ViewData

@page
@model RazorPagesMovie.Pages.Movies.IndexModel

@{
    ViewData["Title"] = "Index";
}

你可以在Razor Page页面中设置ViewData的键值,在_Layout.cshtml模版页面中使用你设置的ViewData

关于注释

在Razor Page中,用下面的方式写注释

@*这里是注释*@

关于全局的模版页设置

在_ViewStart.cshtml文件中,我们为所有的页面设置了母板页,代码如下:

@{
    Layout = "_Layout";
}

注意,在这里我们并没有详细讲链接标签: asp-page="./Edit" asp-route-id="@item.ID"

以后的文章里我们会说到!

时间: 2024-10-10 18:26:31

ASP.NET Core教程【一】关于Razor Page的知识的相关文章

ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证

前文索引:ASP.NET Core教程[一]关于Razor Page的知识 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" class="navbar-brand">RazorPagesMovie</a> 这段代码中用到asp-page这样的一个特有属性,这是razor page特有的, 这是一个锚点属性,它的值将被编译到a标签的href属性上: 跟多的时候,我们会像下面这样使用锚点属性

Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page

Razor Page介绍 前言     上周期待已久的Asp.Net Core 2.0提前发布了,一下子Net圈热闹了起来,2.0带来了很多新的特性和新的功能,其中Razor Page引起我的关注,作为web程序员来说,Asp.Net下的任何web框架都会去特别关注,因为每次一个新的框架出来,意味着一次革命.此次的Razor Page是否能带来不一样的体验呢,让我们一起来看看吧. 什么是Razor Page     我们都知道在Asp.Net MVC中,Razor是其一种视图引擎.而今天我们介绍

Do You Kown Asp.Net Core - 根据实体类自动创建Razor Page CURD页面模板

Scaffolding Template Intro 我们知道在Asp.Net MVC中,如果你使用的EF的DBContext的话,你可以在vs中通过右键解决方案-添加控制器-添加包含视图的控制器,然后vs会根据你选择的Model自动生成相应的CURD的控制器和View,非常便利,这种就叫做 ASP.NET Scaffolding Template,之前雪燕大大有过一篇介绍,有兴趣可以看看[传送门] 大家知道近期Asp.Net Core2.0发布了,微软也推出了Razor Page来作为默认的A

Windows Server 2012 R2 Standard搭建ASP.NET Core环境图文教程_实用技巧

前言: 随着ASP.NET Core 1.0的发布,论坛里相关的文章也越来越多,正好有时间在测试环境上搭建 ASP.NET Core的发布环境,把过程中遇到的问题写给大家,以便有用到的朋友需要. 环境: Windows Server 2012 R2 Standard with Update MSDN 链接:ed2k://|file|cn_windows_server_2012_r2_with_update_x64_dvd_6052725.iso|5545705472|121EC13B53882E

ASP.NET Core配置教程之读取配置信息_实用技巧

提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中.到了.NET Core的时候,很多我们习以为常的东西都发生了改变,其中也包括定义配置的方式.总的来说,新的配置系统显得更加轻量级,并且具有更好的扩展性,其最大的特点就是支持多样化的数据源.我们可以采用内存的变量作为配置的数据源,也可以直接配置定义在持久化的文件甚至数据库中. 由

在windows上使用asp.net core创建 Razor 页面 Web 应用

安装以下组件: .NET Core 2.0.0 SDK 或更高版本. 已安装 ASP.NET 和 Web 开发工作负载的 Visual Studio 2017 15.3 版或更高版本. 1.添加数据模型 在解决方案资源管理器中,右键单击"RazorPagesMovie"项目 >"添加" > "新建文件夹". 将文件夹命名为"Models". 右键单击"Models"文件夹. 选择"添加

【翻译】使用Visual Studio在Azure上部署Asp.Net Core Web应用

配置运行环境 Install the latest Azure SDK for Visual Studio. The SDK installs Visual Studio if you don't already have it. 安装Azure SDK for Visual Studio,如果你的Visual Studio还没有安装这个SDK的话 Install .NET Core + Visual Studio tooling 安装.NET Core + Visual Studio tool

ASP.NET Core学习之二 菜鸟踩坑

对于像我这样没接触过core的人,坑还是比较多的,一些基础配置和以前差别很大,这里做下记录 一.Startup 1.注册服务 // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc(); // services.Ad

《ASP网页制作教程》笔记

笔记|教程|网页 <ASP网页制作教程>.王国荣 编著,人民邮电出版社. 打开MDB数据库的方法:先定义一个OpenMDB子程序,然后在主程序中调用.<%Option ExplicitSub OpenMDB(dbname,pwd,conn)'dbname-数据库文件的相对路径,pwd-数据库文件的密码,conn-用户定义的Connection对象.'对于没有密码的数据库,pwd值可任意.dim connstrSet conn = Server.CreateObject("ADO