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标签;

时间: 2024-10-07 17:10:31

ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证的相关文章

ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需要将相应的ValidationAttribute应用到Model的类型或者属性上即可.对于自定义验证,我们也只需要定义相应的Validation就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤.[源代码从这里下载] 一.AgeRangeAttrib

ASP.NET MVC5验证系列之服务端验证_实用技巧

 这篇文章,我将会说到,使用数据注解API来进行服务端验证.ASP.NET MVC 框架在执行的时候,验证所有传递到控制器的数据,如果验证失败就把错误消息,填充到ModelState对象中,并且把这个对象传递给控制器,然后控制器中的方法,根据Modelstate的状态来判断,是否验证失败还是验证通过. 在这里,我将会使用两种方法来验证数据的合法性,一个是手动添加错误消息到ModelState对象中,另外一个方法是使用数据注解[Data Annotation] API,来做. 先来看看使用手动验证

android 扫描二维码后客户端无自动跳转反应且服务端并没有收到来自客户端的请求

问题描述 android 扫描二维码后客户端无自动跳转反应且服务端并没有收到来自客户端的请求 我的代码是这样写的,我希望就是利用Scanner扫描后联网判断账户与密码的正确性,现在的情况是能够get到二维码的内容,但就是没有执行联网查询的操作,是不是不应该在OnActivityResult中去这样写呢'? 希望前辈帮忙指点指点思路.谢谢 下面是service的内容: 解决方案 问题不再这里.你service里面是怎么写的啊?在AndroidManifest.xml里面有没有注册上啊? 解决方案二

ASP.NET:使用DataTable对象保存数据

asp.net|对象|数据 DataSet对象是数据表的集合(DataTables),在一个DataSet中可以存放多个DataTable.作为数据源,DataSet可以提供多个数据表,在DataSet中可以进行表的关联操作工作,同样,每个DataTable对象也可以作为数据源.下面这个实例演示了DataTable对象如何提供给DropDownList控件提供数据源的.     新建一个Web窗体,命名为DataTable_Simple.aspx,添加两个DropDownList控件,设计窗口如

asp javascript 实现关闭窗口时保存数据的办法_javascript技巧

关闭窗口时保存数据的办法 <SCRIPT language="javascript">  function IfWindowClosed()  {   var win = null;  try  {  window.opener.name = "ss";  if ( window.opener.name != "ss" )  {  win = window.open("quit.asp","",

ASP.NET Core教程【一】关于Razor Page的知识

关键文件和目录结构 按照asp.net core WEB应用程序向导,创建一个工程之后 你会发现如下几个目录和文件 wwwroot:放置网站的静态文件的目录 Pages:放置razor页面的目录 appsettings.json:是应用的配置文件 bower.json:静态资源包管理的配置文件 Program.cs:这个程序负责承载ASP.NET Core应用 Startup.cs:初始化service的配置,初始化请求管道 下面我们单独说一下Pages目录 _Layout.cshtml 是整个

由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。(含服务端代码)

问题描述 演练一个Windows应用程序-聊天软件,分别有服务端和客户端问题是在服务端激发buttonStop_Click事件时出现"由于套接字没有连接并且(当使用一个sendto调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受."错误,不知道如何解决,麻烦高手帮帮我//下面是服务端代码usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSys

ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET Core应用中基于依赖注入的编程主要涉及到两个方面,它们分别是将服务注册到ServiceCollection中,和采用注入的方式利用ServiceProvider提供我们所需的服务.我们先来讨论ASP.NET Core应用中如何进行服务注册.[本文已经同步到<ASP.NET Core框架揭秘>之中

Ubuntu Server Rsync服务端与Windows cwRsync客户端数据同步配置方法_服务器其它

说明:1.Rsync服务端 系统:Ubuntu Server 11.10 IP地址:192.168.21.168 数据存放目录:/home/mysql_data2.cwRsync客户端 系统:Windows Server 2003 IP地址:192.168.21.130 同步的目录:D:\mysql_data实现目的:cwRsync客户端每天凌晨3:00钟自动同步Rsync服务端/home/mysql_data目录中的数据到D:\mysql_data目录一.Rsync服务端配置 1.开启防火墙t