關鍵文件和目錄結構
按照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"
以后的文章里我們會說到!