2018-08-03

使用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
image

Pages/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 派生的类称为 Model, 此构造函数使用依赖关系注入将 MovieContext 添加到页。所有已搭建基架的页面都遵循此模式。
OnGet 返回 voidOnGetAsync 返回 Task时,不使用任何返回方法。 当返回类型是 IActionResultTask 时,必须提供返回语句。 例如,Pages/Movies/Create.cshtml.cs OnPostAsync 方法:

public async Task 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”。 登录失败。 用户“用户名”登录失败。

你可能感兴趣的:(2018-08-03)