ASP.NET Core教程【二】從保存數據看Razor Page的特有屬性與服務端驗證


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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM