博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习ASP.NET Core Razor 编程系列八——并发处理
阅读量:6914 次
发布时间:2019-06-27

本文共 3343 字,大约阅读时间需要 11 分钟。

原文:

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

 

 

并发异常处理

         在Visual Studio 2017的解决方案资源管理器中找到 Pages/Books/Edit.cshtml.cs 文件,鼠标双击打开 ,在代码中找到OnPostAsync方法。并按如下代码进行修改:

public async Task
OnPostAsync() { if (!ModelState.IsValid) { return Page(); } _context.Attach(Book).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!_context.Book.Any(e => e.ID == Book.ID)) { return NotFound(); } else { throw; } } return RedirectToPage("./Index"); }

     上面的代码功能是当检测到第一个客户端在删除书籍信息时,第二个客户端对要删除的书籍信息进行修改并保存时发生异常。

      我们可以进行以下操作来重现上面的异常。

  1. 在 catch (DbUpdateConcurrencyException) 上设置断点。如下图。

 

         2. 在Visual Studio 2017中按F5,运行应用程序,在打开的浏览器的一个窗口中,选择一本书籍进行修改。如下图。

         3. 在另一个浏览器窗口中,选择同一本书籍信息的“Delete”链接,然后删除此书籍。

              4. 在编辑书籍信息的浏览器窗口中,将书籍信息的修改内容保存到数据库。如下图。

 

          5. 当两个或更多客户端同时更新记录时,代码通常将检测到并发冲突。如下图。

 

 

GET请求与POST请求

      接下来我们根据 Pages/Books/Edit.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 Microsoft.EntityFrameworkCore;using RazorMvcBooks.Models; namespace RazorMvcBooks.Pages.Books{    public class EditModel : PageModel    {        private readonly RazorMvcBooks.Models.BookContext _context;        public EditModel(RazorMvcBooks.Models.BookContext context)        {            _context = context;        }         [BindProperty]        public Book Book { get; set; }        public async Task
OnGetAsync(int? id) { if (id == null) { return NotFound(); } Book = await _context.Book.SingleOrDefaultAsync(m => m.ID == id); if (Book == null) { return NotFound(); } return Page(); } public async Task
OnPostAsync() { if (!ModelState.IsValid) { return Page(); } _context.Attach(Book).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!_context.Book.Any(e => e.ID == Book.ID)) { return NotFound(); } else { throw; } } return RedirectToPage("./Index"); } }}

    1.  当浏览器对Books/Edit 页面发出 HTTP GET 请求时(例如 ):

  • OnGetAsync 方法从数据库提取书籍信息并把数据传递给Page 方法。
  • Page 方法呈现“Pages/Books/Edit.cshtml”Razor 页面。 Pages/Books/Edit.cshtml 文件包含实体指令 (@model RazorMvcBooks.Pages.Books.EditModel),这使书籍实体在页面上可用。
  • 页面中的表单会显示书籍实体中的值。

      2. 当浏览器对Books/Edit 页面发出Post请求时:

  • 此页面上的表单值将绑定到 Book 属性上。 [BindProperty] 特性会启用实体属性绑定。具体代码参见上面的代码。
  • 如果实体对象的属性值中存在错误(例如,ReleaseDate 无法被转换为日期),则会使用已提交的值再次请求表单。
  • 如果实体对象的属性值中没有错误,则把书籍信息保存到数据库。

       “Index.cshtml”、“Create.cshtml”和“delete.cshtml”Razor 页面中的 HTTP GET 方法的实现原理与上面所述的Get请求类似。 “Create.cshtml”Razor 页面中的 POST请求方法的实现原理与上面所述的POST请求类似。

转载地址:http://ddicl.baihongyu.com/

你可能感兴趣的文章
8月15日 Google收购MOTOROLA移动 125亿美元成交
查看>>
Linux-weblogic 10.3.6控制台密码解密过程
查看>>
我奋斗的目标是什么
查看>>
模式识别 - 视频检测器(VideoDetector)项目设计
查看>>
Android 位置服务与GPS实时定位
查看>>
Nginx配置——用户认证
查看>>
SD卡分区及取消分区
查看>>
创建VLAN、中继链路和参与以太网捆绑的详细配置和截图
查看>>
健康的办公族作息时刻表
查看>>
新博客地址此博客不再更新baishuchao.github.io
查看>>
Git问题Everything up-to-date解决
查看>>
淘宝Tengine安装指南
查看>>
nginx-mysql-php安装配置
查看>>
div加链接 html给div加超链接实现点击div跳转的方法
查看>>
layer 旋转
查看>>
菜鸟学Linux 第016篇笔记 bash脚本之文件测试,变量类型
查看>>
Vue cli 资源文件的引用
查看>>
OCP知识点讲解 之 Undo回滚基础知识
查看>>
跨碧岭观赏龙潭瀑布群
查看>>
Windows 命令打开无线WIFI热点
查看>>