學習ASP.NET Core Razor 編程系列目錄html
學習ASP.NET Core Razor 編程系列二——添加一個實體編程
學習ASP.NET Core Razor 編程系列三——建立數據表及建立項目基本頁面瀏覽器
學習ASP.NET Core Razor 編程系列四——Asp.Net Core Razor列表模板頁面併發
學習ASP.NET Core Razor 編程系列五——Asp.Net Core Razor新建模板頁面async
學習ASP.NET Core Razor 編程系列六——數據庫初始化post
學習ASP.NET Core Razor 編程系列七——修改列表頁面學習
併發異常處理spa
在Visual Studio 2017的解決方案資源管理器中找到 Pages/Books/Edit.cshtml.cs 文件,鼠標雙擊打開 ,在代碼中找到OnPostAsync方法。並按以下代碼進行修改:code
public async Task<IActionResult> 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"); }
上面的代碼功能是當檢測到第一個客戶端在刪除書籍信息時,第二個客戶端對要刪除的書籍信息進行修改並保存時發生異常。
咱們能夠進行如下操做來重現上面的異常。
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<IActionResult> 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<IActionResult> 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 請求時(例如 http://localhost:5000/Books/Edit/9):
2. 當瀏覽器對Books/Edit 頁面發出Post請求時:
「Index.cshtml」、「Create.cshtml」和「delete.cshtml」Razor 頁面中的 HTTP GET 方法的實現原理與上面所述的Get請求相似。 「Create.cshtml」Razor 頁面中的 POST請求方法的實現原理與上面所述的POST請求相似。