学习ASP.NET Core Razor 编程系列目录

学习ASP.NET Core Razor 编程系列一

学习ASP.NET Core Razor 编程系列二——添加一个实体

学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面

学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

上一篇文章中我们学习了列表页面的结构,@page与@model两个关键Razor指令,以及页面布局应该修改哪里。这一篇文章我们来学习一下新建页面。

首先,我们在Visual Studio 2017的解决方案管理器中,打开Pages/Books/Create.cshtml.cs 文件,这个文件中的的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using RazorMvcBooks.Models; namespace RazorMvcBooks.Pages.Books
{
public class CreateModel : PageModel
{
private readonly RazorMvcBooks.Models.BookContext _context;
public CreateModel(RazorMvcBooks.Models.BookContext context)
{
_context = context;
} public IActionResult OnGet()
{
return Page();
} [BindProperty]
public Book Book { get; set; }
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
} _context.Book.Add(Book);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
}
}

OnGet 方法与上一篇文章中的OnGetAsync方法实现的功能一样,都是进行页面初始化。 但是“新建”页面没有任何要初始化的状态。 Page方法会创建一个用于呈现 “新建”页面内容的 PageResult 对象。

属性Book使用 [BindProperty] 特性绑定到“新建”页面实例对象中。 当“新建”页面的表单把表单中的值以POST的方式发送到后台时,ASP.NET Core 运行时会将表单中的值绑定到 Book实体上。

在页面中点击“Create”按钮,即通过POST方法发出表单数据请求时,Asp.Net Core将调用 OnPostAsync 方法:

public async Task<IActionResult> OnPostAsync()
{ if (!ModelState.IsValid)
{
return Page();
} _context.Book.Add(Book);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}

如果有任何错误,没有通过校验规则,页面将重新显示表单,以及我们刚才填写的数据。 在表单发出请求前,也可以通过在客户端添加校验而捕获到大部分错误。 例如以下的一个错误示例,表单中填写的日期字段值无法转换为日期格式数据。

如果不存在错误,应用程序将会把我们填写的数据保存到数据库,并且浏览器会重定向到书籍列表页面,在书籍列表页面中的书籍列表中会出现我们刚才保存的数据。如下图。

         新建页面的 Razor 前台页面

接下来我们在Visual Studio 2017的解决方案资源管理器中使用鼠标左键双击打开 Pages/Books/Create.cshtml Razor文件,文件中的内容如下:

@page
@model RazorMvcBooks.Pages.Books.CreateModel
@{
ViewData["Title"] = "Create";
}
<h2>Create</h2>
<h4>Book</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="Book.Name" class="control-label"></label>
<input asp-for="Book.Name" class="form-control" />
<span asp-validation-for="Book.Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Book.ReleaseDate" class="control-label"></label>
<input asp-for="Book.ReleaseDate" class="form-control" />
<span asp-validation-for="Book.ReleaseDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Book.Author" class="control-label"></label>
<input asp-for="Book.Author" class="form-control" />
<span asp-validation-for="Book.Author" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Book.Price" class="control-label"></label> <input asp-for="Book.Price" class="form-control" />
<span asp-validation-for="Book.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");}
}

Visual Studio以一种独特的字体显示<form method="post"> 标记,如下图:

<form method="post"> 元素是一个表单标记助手。 表单标记助手会自动包含防伪标记。

基架引擎在Razor页面中为每个字段(ID 除外)创建一个类似下面的 Razor 标签,如下所示:

  <div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Book.Name" class="control-label"></label>
<input asp-for="Book.Name" class="form-control" />
<span asp-validation-for="Book.Name" class="text-danger"></span>
</div>

对于上述代码中的一些辅助助手介绍如下:

校验标签助手(<div asp-validation-summary 和 <span asp-validation-for)显示验证错误。

标签辅助助手 (<label asp-for="Book.Name" class="control-label"></label>) 为实体对象字段生成描述标签标题和属性。

输入辅助助手 (<input asp-for="Book.Name" class="form-control" />) 在实体类上采用dataannotations属性,就可以在在客户端生成 jQuery 验证所需的 HTML 属性。

学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面的更多相关文章

  1. C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    C#中的函数式编程:递归与纯函数(二)   在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...

  2. 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 学习ASP.NET Core Blazor编程系列五——列表页面

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  4. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理

    C#编译器优化那点事   使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...

  6. 学习ASP.NET Core Razor 编程系列六——数据库初始化

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. 学习ASP.NET Core Razor 编程系列七——修改列表页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  8. 学习ASP.NET Core Razor 编程系列八——并发处理

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. 学习ASP.NET Core Razor 编程系列九——增加查询功能

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. gradle build docker image

    前言:其实gradle-docker插件干的事和我们手动制作镜像是一样的,只不过它封装了一些步骤而已. eg:如果我们要将项目打包成镜像,首先我们要写Dockerfile,这是制作镜像的不可或缺的第一 ...

  2. 第一周CoreIDRAW课总结

      一. 问:这节课学到了什么知识? 答:这节课我学到了很多知识,作为初学者的我,老师给我讲了CorelDEAW的启动,安装,基础知识和应用与用途. 基础知识 位图:是由无数个像素点构成的图像,又叫点 ...

  3. Dubbo源码-从HelloWorld开始

    Dubbo简介 Dubbo,相信做后端的同学应该都用过,或者有所耳闻.没错,我就是那个有所耳闻中的一员. 公司在好几年前实现了一套自己的RPC框架,所以也就没有机会使用市面上琳琅满目的RPC框架产品. ...

  4. 基于hi-nginx的web开发(python篇)——路由装饰器

    现在,有了起步的基本认识,现在需要一个可以媲美flask或者bottle的简洁易用的路由功能,可以用装饰器写法任意映射 URLs 到代码. 这个,并不难.首先,来一个叫做hi的模块:hi.py: im ...

  5. .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧

    一.前言 为什么要调试代码?通过调试可以让我们了解代码运行过程中的代码执行信息,比如变量的值等等.通常调试代码是为了方便我们发现代码中的bug.ken.io觉得熟练代码调试技巧是成为合格程序员的基本要 ...

  6. NOIP2017划水崩盘记

    Before-Day1              自信心爆棚,老子一定能拿省一.一天啥也没干,一顿乱奶.敬等明日切T1写暴力. Day 1 哈哈哈,T1是数论,闭眼睛切啊!! ...然后就Gg了,写的 ...

  7. lua对多个精灵执行一系列动作,延时失效

    function MainPlayerCards:sendCards() local winSize = cc.Director:getInstance():getWinSize() local nS ...

  8. mybatis整合oracle 实现一对多查询 备注?

    <resultMap type="com.asiainfo.channel.model.weeklyNewspaper.WorkReportInfo" id="Wo ...

  9. 【WCF系列】(二)设计和实现服务协定

    设计和实现服务协定 WCF术语介绍 服务(Service):服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作. 终结点(EndPoint):终结点是用来发送或接收消息(或 ...

  10. Sublime Text3下使用Python,REPL的安装与快捷键设置方法

    前提条件:连接外网   1.安装管理插件(CTRL+SHIFT+P),找到Package Control:install package一项,回车后继续选择SublimeREPL插件,进行安装:   ...