使用ASP.NET Core创建Razor页面Web应用
系统必备
1. .NET Core 2.1 SDK或更高版本
2. 具有以下工作负载的Visual Studio 2017 15.7.3版或更高版本:
ASP.NET 和 Web开发
.NET Core 跨平台开发
创建Razor Web应用
文件>新建>项目
image选择“ASP.NET Core 2.1”
image image项目文件和文件夹
文件或文件夹 目标
wwwroot | 包含静态 |
---|---|
Pages | Razor Pages的文件夹 |
oppsetttings.json | 配置 |
Program.cs | 配置 ASP.NET Core 应用的主机 |
Startup.cs | 配置服务和请求管道 |
Pages/Shared 文件夹
_Layout.cshtml 文件 | 包含常见的 HTML 元素(脚本和样式表链接),并设置应用的布局 |
---|---|
_ValidationScriptsPartial.cshtml 文件 | 提供对 jQuery 验证脚本的引用 |
_CookieConsentPartial.cshtml 文件 | 提供了导航栏以及用于汇总隐私和 cookie 使用策略的目录 |
_ViewStart.cshtml文件 | 将 Razor Pages Layout 属性设置为使用 _Layout.cshtml文件 |
_ViewImports.cshtml 文件 | 包含要导入每个 Razor 页面的 Razor 指令 |
在 ASP.NET Core 中向 Razor 页面应用添加模型
在解决方案资源管理器中,右键单击“RazorPagesMovie”项目 >“添加” > “新建文件夹”,将文件夹命名为“Models”。右键单击“Models”文件夹。 选择“添加” >“类”。 将类命名为“Movie”,将 Movie 类的内容替换为以下代码:
using System;
usingSystem.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.Models{
public class Movie {
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
搭建模型的基架
对模型执行创建、读取、更新和删除 (CRUD) 操作。
创建“Pages/Movies”文件夹:
- 在解决方案资源管理器中,右键单击“Pages”文件夹 >“添加”>“新建文件夹”。
- 将文件夹命名为“Movies”
在解决方案资源管理器中,右键单击“Pages/Movies”文件夹 >“添加”>“新搭建基架的项目”。
image image imagePages/Movies/Index.cshtml.cs 页面模型
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace RazorPagesMovie.Pages.Movies
{
public class IndexModel : PageModel
{
private readonly RazorPagesMovie.Models.RazorPagesMovieContext _context;
public IndexModel(RazorPagesMovie.Models.RazorPagesMovieContext context)
{
_context = context;
}
public IList Movie { get; set; }
public async Task OnGetAsync()
{
Movie = await _context.Movie.ToListAsync();
}
}
}
Razor 页面派生自 PageModel
, 按照约定,PageModel
派生的类称为 <PageName>Model
, 此构造函数使用依赖关系注入将 MovieContext
添加到页。所有已搭建基架的页面都遵循此模式。
当 OnGet
返回 void
或 OnGetAsync
返回 Task
时,不使用任何返回方法。 当返回类型是 IActionResult
或 Task<IActionResult>
时,必须提供返回语句。 例如,Pages/Movies/Create.cshtml.cs OnPostAsync
方法:
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Movie.Add(Movie);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
设定数据库种子
在 Models 文件夹中创建一个名为 SeedData 的新类。 将生成的代码替换为以下代码:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;using System.Linq;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext( serviceProvider.GetRequiredService>()))
{
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
添加种子初始值设定项
在 Program.cs 中,修改 Main 方法以执行以下操作:
从依赖关系注入容器获取数据库上下文实例。
调用 seed 方法,并将上下文传递给它。
Seed 方法完成时释放上下文。
下面的代码显示更新后的 Program.cs 文件:
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;
using Microsoft.EntityFrameworkCore;
namespace RazorPagesMovie
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService();
context.Database.Migrate();
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup();
}
}
生产应用不会调用 Database.Migrate
。 它会添加到上面的代码中,以防止在未运行 Update-Database
时出现以下异常:
SqlException:无法打开登录请求的数据库“RazorPagesMovieContext-21”。 登录失败。 用户“用户名”登录失败。
网友评论