前文索引:
ASP.NET Core教程【一】關於Razor Page的知識
在layout.cshtml文件中,咱們能夠看到以下代碼:
<a asp-page="/Index" class="navbar-brand">RazorPagesMovie</a>
這段代碼中用到asp-page這樣的一個特有屬性,這是razor page特有的,
這是一個錨點屬性,它的值將被編譯到a標籤的href屬性上;
跟多的時候,咱們會像下面這樣使用錨點屬性
<a asp-controller="Speaker" asp-action="Detail">Speaker Detail</a>
編譯過以後,上面的連接是這樣的
<a href="/Speaker/Detail">Speaker Detail</a>
這很好的把action和controller分開了
下面咱們看看把實體提交到數據庫的代碼(cshtml.cs文件中)
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using RazorPagesMovie.Models;
using System.Threading.Tasks;
namespace RazorPagesMovie.Pages.Movies
{
public class CreateModel : PageModel
{
private readonly RazorPagesMovie.Models.MovieContext _context;
public CreateModel(RazorPagesMovie.Models.MovieContext context)
{
_context = context;
}
public IActionResult OnGet()
{
return Page();
}
[BindProperty]
public Movie Movie { get; set; }
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Movie.Add(Movie);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
}
}
通常咱們在OnGet方法中初始化頁面須要的狀態數據;
這個頁面沒有狀態數據須要初始化,因此咱們就不用作任何事情
Page()方法返回一個PageResult對象,該對象負責渲染這個頁面;
Movie屬性被標記了BindProperty標記,說明它是一個「模型綁定」對象;
當表單提交過來的時候,asp.net core負責把表單提交的數據,綁定到這個對象上;
表單提交以後,OnPostAsync方法被執行,
若是提交的數據,在綁定到Movie對象的過程當中,產生了異常,那麼Page方法會被從新執行,等於刷新了一遍頁面;
大部分數據驗證的工做是在客戶端經過JS完成的
可是咱們也不能徹底依賴JS(防止模擬瀏覽器,惡意提交)
客戶端提交上來了一個表單域是一個日期字符串,在綁定到對象屬性的時候,可能產生異常,若是產生了異常,ModelState.IsValid就非真。
接下來看看頁面代碼:
@page
@model RazorPagesMovie.Pages.Movies.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");}
}
<form method="post">在razor page中也是一個特殊標籤,
這個標籤會自動添加一個反僞造令牌,用於防止跨站腳本攻擊;
asp-validation-summary和asp-validation-for都是用於顯示客戶端驗證的失敗信息的
<label asp-for="Movie.Title" class="control-label"></label>會輸出包含標題和for屬性的label標籤;
<input asp-for="Movie.Title" class="form-control" />會使用模型裏的DataAnnotations屬性,生成能做用域jQuery Validation插件的input標籤;