Razor 页面是 ASP.NET Core MVC 的一个新功能,它可以使基于页面的编码方式更简单高效。
Razor 页面是 ASP.NET Core 2.0 中的一个新选择,它是基于页面的编程模型,可以实现更简单、更高效地生成 Web UI
安装 .NET Core 2.0.0 或更高版本。
如果在使用 Visual Studio,请使用以下工作负载安装 Visual Studio 2017 版本 15.3 或更高版本:
一、 创建Razor项目
1. 新建项目
2. 选择web应用程序,不是选择空,这样可以查看默认的代码结构。
3. 代码结构
二、 项目文件和文件夹
1. wwwroot :包含静态文件。 请参阅使用静态文件。
2. Pages: Razor Pages的文件夹。
3. appsettings.json:配置文件
4. Program.cs: 托管 ASP.NET Core 应用。
5. Startup.cs:配置服务和请求管道。 请参阅启动。
三、 添加数据模型
Movie类:
public class Movie { public int ID { get; set; } [Display(Name = "标题")] [StringLength(10, MinimumLength = 3)] public string Title { get; set; } [Display(Name = "发布时间")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } [Display(Name = "类型")] public string Genre { get; set; } [Display(Name = "价格")] public decimal Price { get; set; } } }
MovieContext类:(EF MySql Core)
public class MovieContext : DbContext { public MovieContext(DbContextOptions<MovieContext> options) : base(options) { } public DbSet<Movie> Movie { get; set; } }
appsettings.json
{ "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Warning" } }, "ConnectionStrings": { "MovieContext": "Data Source=;Database=;uid=root;pwd=;port=3306;SslMode=none;Convert Zero Datetime=true;persist security info=true;charset=utf8;Pooling=true;" } }
Startup类:(默认依赖注入)
这里需要在NuGet中下载mysql core 包 MySql.Data.EntityFrameworkCore
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddDbContext<MovieContext>(options => options.UseMySQL(Configuration.GetConnectionString("MovieContext"))); services.AddMvc(); }
四、实现增,删,改,查
1. 对页面发出请求时,OnGetAsync
方法向 Razor 页面返回影片列表。 在 Razor 页面上调用 OnGetAsync
或 OnGet
以初始化页面状态。 在这种情况下,OnGetAsync
将获得影片列表并显示出来。
2. 当 OnGet
返回 void
或 OnGetAsync
返回 Task
时,不使用任何返回方法。
3. 当返回类型是 IActionResult
或 Task<IActionResult>
时,必须提供返回语句。
cs:
public class CreateModel : PageModel { private readonly MovieContext _context; public CreateModel(MovieContext context) { _context = context; } public IActionResult OnGet() { return Page(); } [BindProperty] public WebApp_Razor.Models.Movie Movie { get; set; } public async Task<IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return Page(); } _context.Movie.Add(Movie); await _context.SaveChangesAsync(); return RedirectToPage("./Index"); } }
html:
@page @model CreateModel @{ ViewData["Title"] = "Create"; } <h2>Create</h2> <h4>Movie</h4> <hr /> <div class="row"> <div class="col-md-4"> <form method="post"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="Movie.Title" class="control-label"></label> <input asp-for="Movie.Title" class="form-control" /> <span asp-validation-for="Movie.Title" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Movie.ReleaseDate" class="control-label"></label> <input asp-for="Movie.ReleaseDate" class="form-control" /> <span asp-validation-for="Movie.ReleaseDate" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Movie.Genre" class="control-label"></label> <input asp-for="Movie.Genre" class="form-control" /> <span asp-validation-for="Movie.Genre" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Movie.Price" class="control-label"></label> <input asp-for="Movie.Price" class="form-control" /> <span asp-validation-for="Movie.Price" class="text-danger"></span> </div> <div class="form-group"> <input type="submit" value="Create" class="btn btn-default" /> </div> </form> </div> </div> <div> <a asp-page="Index">Back to List</a> </div> @section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } }