前文索引:
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標簽;