关键文件和目录结构

按照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"

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

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

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

    前文索引:ASP.NET Core教程[一]关于Razor Page的知识 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" ...

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

    前文索引: 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" class="navbar-brand" ...

  3. ASP.NET Core教程【三】实体字段属性、链接标签、并发数据异常、文件上传及读取

    前文索引:ASP.NET Core教程[二]从保存数据看Razor Page的特有属性与服务端验证ASP.NET Core教程[一]关于Razor Page的知识 实体字段属性 再来看看我们的实体类 ...

  4. Asp.net core 2.0.1 Razor 的使用学习笔记(五)

    按说这里应该写关于Role角色类的笔记,但是我还没时间实验这块,所以等以后我搞定了再来分享.现在先写其他部分. Asp.net core 2.0.1 Razor 的使用学习笔记——建立模型 按照微软官 ...

  5. asp.net.core教程

    asp.net.core教程(翻译自微软官方文档https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/adding- ...

  6. Asp.net core 2.0.1 Razor 的使用学习笔记(六)

    Asp.net core 2.0.1 Razor 的使用学习笔记——基本页面的建立 VS这版(vs版本:15.5.6  .net版本:4.7.02558)的Razor页面自动生成就是坑爹货,它自动生成 ...

  7. ASP.NET Core 快速入门(Razor Pages + Entity Framework Core)

    引子 自从 2009 年开始在博客园写文章,这是目前我写的最长的一篇文章了. 前前后后,我总共花了 5 天的时间,每天超过 3 小时不间断写作和代码调试.总共有 8 篇文章,每篇 5~6 个小结,总截 ...

  8. Asp.net core 2.0.1 Razor 的使用学习笔记(一)

    环境:vs2017 版本:15.5.6 一.新建项目 1.文件>新建>项目>Visual c#>.NET Core>ASP.NET Core Web应用程序(“.NET ...

  9. 基于 ASP.NET Core 2.1 的 Razor Class Library 实现自定义错误页面的公用类库

    注意:文中使用的是 razor pages ,建议使用 razor views ,使用 razor pages 有一个小坑,razor pages 会用到 {page} 路由参数,如果应用中也用到了这 ...

随机推荐

  1. 深入浅出Diffie–Hellman

    一.作者 这个密钥交换方法,由惠特菲尔德·迪菲(Bailey Whitfield Diffie).马丁·赫尔曼(Martin Edward Hellman)于1976年发表. 二.说明 它是一种安全协 ...

  2. 关于string.h中字符串的操作

     string.h中字符操作的函数 注意:**对字符数组的多次操作需要进行赋初值.或者善于用memset()函数进行清空数组的操作.**     否则容易出现错误. string.h文件中函数的用法加 ...

  3. table插件

    //动态添加一行function addRow(){ var firstrow=document.getElementById('firstrow'); var firstCopy=firstrow. ...

  4. VIM格式化代码(How to format code with VIM)

    1) 按两下小写g,即gg,定位光标到第一行.(2) 按住Shift+v,即大写V,进入可视化编辑的列编辑模式.(3) Shift+g,即大写G,选中整个代码.(4) 按下等号=,格式化所有代码.

  5. Django数据库操作性能相关

    Django数据库操作性能相关 案例: 现在我们的数据库中有两张表如下: 1.职员表: class UserInfo(models.Model): name = models.CharField(ma ...

  6. apache+php+mysql运行环境

    建议Apache2.4+php5.6+mysql5.5+phpmyadmin4.4.4 参考: http://jingyan.baidu.com/article/fcb5aff797ec41edaa4 ...

  7. Lua 5.3 协程简单示例

    Lua 5.3 协程简单示例 来源 http://blog.csdn.net/vermilliontear/article/details/50547852 生产者->过滤器->消费者 模 ...

  8. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  9. CodeForces 11D(状压DP 求图中环的个数)

    Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...

  10. Linux系列教程(十四)——Linux用户和用户组管理之相关配置文件

    前面我们介绍了软件包管理.首先介绍了rpm包的相关命令,但是我们发现直接安装rpm包会被其依赖性折磨的不行,然后解决办法是yum在线管理,通过yum命令安装rpm包能自动帮助我们解决依赖性.最后又介绍 ...