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(, MinimumLength = )]
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");
}
}