zoukankan      html  css  js  c++  java
  • 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标签;


  • 相关阅读:
    python-数据结构代码 双端队列
    python-数据结构代码 队列
    python-数据结构代码 栈
    给原有界面添加一个停止训练功能
    day_002 while循环、格式化输出(%s)、运算符、
    py_day01 变量、数据类型(int、str、bool)、if
    STL中的unique()和lower_bound ,upper_bound
    c++容器中map的应用
    结构体的sort排序
    最大子段和
  • 原文地址:https://www.cnblogs.com/liulun/p/7899671.html
Copyright © 2011-2022 走看看