ASP.NET Core教程【一】關於Razor Page的知識

關鍵文件和目錄結構

按照asp.net core WEB應用程序嚮導,建立一個工程以後html

你會發現以下幾個目錄和文件jquery

  • wwwroot:放置網站的靜態文件的目錄
  • Pages:放置razor頁面的目錄
  • appsettings.json:是應用的配置文件
  • bower.json:靜態資源包管理的配置文件
  • Program.cs:這個程序負責承載ASP.NET Core應用
  • Startup.cs:初始化service的配置,初始化請求管道

下面咱們單獨說一下Pages目錄web

_Layout.cshtml 是整個網站的母板文件,sql

除了在這裏寫佈局頁面的代碼外,數據庫

你還能夠把一些基礎的樣式和腳本放在這裏,json

_ViewStart.cshtml 負責設置全部Razor頁面都會用到的Layout屬性,app

_ViewImports.cshtml 負責設置全部頁面都會用到的指令,好比引入什麼類庫等asp.net

_ValidationScriptsPartial.cshtml 負責引用驗證腳本,好比jquery的validation組件async

數據庫連接字符串放在哪兒

在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"

之後的文章裏咱們會說到!

相關文章
相關標籤/搜索