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

简介: 关键文件和目录结构按照asp.net core WEB应用程序向导,创建一个工程之后你会发现如下几个目录和文件wwwroot:放置网站的静态文件的目录Pages:放置razor页面的目录appsettings.

关键文件和目录结构

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

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

目录
相关文章
|
5天前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
16 7
|
5天前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
15天前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
28 0
|
15天前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
35 0
|
19天前
|
开发框架 监控 .NET
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
|
19天前
|
Linux C# C++
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
|
28天前
|
开发框架 .NET API
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
|
28天前
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
|
前端开发 .NET 数据库
【译】ASP.NET MVC 5 教程 - 4:添加模型
原文:【译】ASP.NET MVC 5 教程 - 4:添加模型 在本节中,我们将添加一些管理电影数据库的类,这些类在ASP.NET MVC 应用程序中扮演“Model”的角色。 我们将使用.NET Framework平台上熟知的Entity Framework 数据访问技术来定义和使用这些模型。
934 0
|
前端开发 .NET 数据库
【译】ASP.NET MVC 5 教程 - 6:通过控制器访问模型的数据
原文:【译】ASP.NET MVC 5 教程 - 6:通过控制器访问模型的数据 在本节中,你将新建一个MoviesController 类,并编写获取电影数据的代码,使用视图模板将数据展示在浏览器中。 在进行下一步之前,你需要先编译应用程序,否则在添加控制器的时候会出错。
1110 0