大佬教程收集整理的这篇文章主要介绍了当模型属性具有 [ConcurrencyCheck] 属性时,ASP.NET Core MVC ConcurrencyCheck 失败,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我是 ASP.NET Core MVC 中的并发检查的新手,一定是在这里实现了一些错误,但是 Microsoft 文档似乎很薄弱。有没有人能指出我正确的方向?
这是一个简单的用户类,可由管理员编辑。如果没有任何并发检查,表单更改将毫无问题地保存到数据库中,但是,当我将 [Concurrencycheck] 属性添加到模型属性之一时,即使字段值发生更改,保存到数据库也会失败(我是期望这只会在用户 A 在用户 B 之前更新字段时失败,等等)
任何帮助将不胜感激。
这里有一些片段。
型号
@H_502_11@public class MyUser : IDentityUser { [Concurrencycheck] [PersonalData] [displayname("First name")] [column(Typename = "nvarchar(100)")] public String Firstname { get; set; } [PersonalData] [displayname("last name")] [column(Typename = "nvarchar(100)")] public String Lastname { get; set; } [displayname("created date")] [column(Typename = "datetiR_508_11845@e")] public datetiR_508_11845@e CreateddatetiR_508_11845@e { get; set; } [displayname("Customer ID")] [column(Typename = "int")] public int CustomerID { get; set; } public String GetFullname() { return $"{FirstnamE} {LastnamE}"; } }
控制器
@H_502_11@ // GET: UserController/Edit/5 public ActionResult Edit(String ID) { // New user vIEw model. Userviewmodel userviewmodel = new Userviewmodel(); // Get user details. MyUser user = _context.Users.Where(u => u.id == ID).Single(); var roles = _context.UserRoles.Where(r => r.UserID == ID).ToList(); if (user != null) { // Set viewmodel user with user details. userviewmodel.thisUser = user; // userviewmodel.thisUserRoles = _context.UserRoles.Where() // Get roles assigned to the user. //userviewmodel.thisUserRoles = _context.userRoles.Where(r => r.UserID == ID).ToList(); // Set viewmodel variables based on which roles the user has. if (roles.Count > 0) { foreach(var role in roles) { switch (_context.Roles.Where(r => r.ID == role.RolEID).SELEct(r => r.Name).Single().ToString()) { case "User": userviewmodel.UserRole = true; break; case "SALEs User": userviewmodel.SALEsUserRole = true; break; case "SALEs Branch User": userviewmodel.SALEsBranchUserRole = true; break; case "SALEs administrator": userviewmodel.SALEsadministrator = true; break; case "administrator": userviewmodel.administrator = true; break; } } } return VIEw(userviewmodel); } else { VIEwBag.Errormessage = "The user Could not be found."; return RedirectToAction("Index"); } } // POST: UserController/Edit/5 [httpPost] [ValIDateAntiForgeryToken] public ActionResult Edit(Userviewmodel userviewmodel) { if (ModelState.IsValID) { userviewmodel.thisUser.Username = userviewmodel.thisUser.Email; userviewmodel.thisUser.normalizedUsername = userviewmodel.thisUser.Email.toupper(); userviewmodel.thisUser.normalizedEmail = userviewmodel.thisUser.Email.toupper(); try { _context.Entry(userviewmodel.thisUser).State = EntityState.ModifIEd; _context.SaveChanges(); } catch (Exception eX) { // Prompt the user to try again. ModelState.AddModelError("","The information has been updated by someone else before you saved. Please try again."); return VIEw(userviewmodel); } } return RedirectToAction("Index"); }
查看
@H_502_11@@model MyApp.viewmodelS.Userviewmodel @{ VIEwData["title"] = "Edit"; Layout = "~/VIEws/Shared/_Layout.csHTML"; } @*<h1>Edit</h1>*@ @*<h5> Details </h5> <hr />*@ <div class="row"> <div class="col-md-4"> <form asp-action="Edit"> <div asp-valIDation-sumMary="All" class="text-danger"></div> @HTMl.HIDdenFor(m => m.thisUser.ID) @HTMl.HIDdenFor(m => m.thisUser.passwordHash) @HTMl.HIDdenFor(m => m.thisUser.LockoutEnd) @HTMl.HIDdenFor(m => m.thisUser.LockoutEnabled) @HTMl.HIDdenFor(m => m.thisUser.AccessFailedCount) @HTMl.HIDdenFor(m => m.thisUser.CreateddatetiR_508_11845@E) @HTMl.HIDdenFor(m => m.thisUser.SecurityStamp) @HTMl.HIDdenFor(m => m.thisUser.ConcurrencyStamp) @HTMl.HIDdenFor(m => m.thisUser.EmailConfirmed) <div class="form-group"> <label asp-for="thisUser.Firstname" class="control-label"></label> <input asp-for="thisUser.Firstname" class="form-control" /> <span asp-valIDation-for="thisUser.Firstname" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="thisUser.Lastname" class="control-label"></label> <input asp-for="thisUser.Lastname" class="form-control" /> <span asp-valIDation-for="thisUser.Lastname" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="thisUser.Email" class="control-label"></label> <input asp-for="thisUser.Email" class="form-control" /> <span asp-valIDation-for="thisUser.Email" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="thisUser.Phonenumber" class="control-label"></label> <input asp-for="thisUser.Phonenumber" class="form-control" /> <span asp-valIDation-for="thisUser.Phonenumber" class="text-danger"></span> </div> <div class="form-group form-check"> <label class="form-check-label"> <input class="form-check-input" asp-for="thisUser.PhonenumberConfirmed" /> @HTMl.displaynameFor(model => model.thisUser.PhonenumberConfirmed) </label> </div> <div class="form-group form-check"> <label class="form-check-label"> <input class="form-check-input" asp-for="thisUser.TwoFactorEnabled" /> @HTMl.displaynameFor(model => model.thisUser.TwoFactorEnabled) </label> </div> <div class="form-group"> <label asp-for="thisUser.CustomerID" class="control-label"></label> <input asp-for="thisUser.CustomerID" class="form-control" /> <span asp-valIDation-for="thisUser.CustomerID" class="text-danger"></span> </div> <h5> Roles </h5> <hr /> <div class="form-group form-check"> <label class="form-check-label"> <input class="form-check-input" asp-for="UserRole" /> @HTMl.displaynameFor(model => model.UserRolE) </label> </div> <div class="form-group form-check"> <label class="form-check-label"> <input class="form-check-input" asp-for="SALEsUserRole" /> @HTMl.displaynameFor(model => model.SALEsUserRolE) </label> </div> <div class="form-group form-check"> <label class="form-check-label"> <input class="form-check-input" asp-for="SALEsBranchUserRole" /> @HTMl.displaynameFor(model => model.SALEsBranchUserRolE) </label> </div> <div class="form-group form-check"> <label class="form-check-label"> <input class="form-check-input" asp-for="SALEsadministrator" /> @HTMl.displaynameFor(model => model.SALEsadministrator) </label> </div> <div class="form-group form-check"> <label class="form-check-label"> <input class="form-check-input" asp-for="administrator" /> @HTMl.displaynameFor(model => model.administrator) </label> </div> <div class="form-group"> <input type="submit" value="Save" class="btn btn-priMary" /> </div> </form> </div> </div> <div> <a asp-action="Index">BACk to List</a> </div> @section Scripts { @{await HTMl.RenderPartialAsync("_ValIDationScriptsPartial");} }
根据ms官方文档,推荐使用行版到handle concurrency conflicts。
从文档中总结一下,我们需要添加一个名为“RowVersion”的列,其数据类型为“rowversion”,并将其添加到您的实体中。
1654155318
public byte[] RowVersion { get; set; }
接下来,在调用 await _context.SaveChangesAsync();
之前,我们需要将原始 RowVersion 属性值放入实体的 OriginalValues 集合中
[httpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> EditAsync(UserviewModel userviewModel)
{
if (ModelState.IsValid)
{
try
{
_context.Entry(userviewModel.thisUser).Property("RowVersion").originalValue = userviewModel.thisUser.RowVersion;
_context.update(userviewModel.thisUser);
await _context.SaveChangesAsync();
}
catch (Exception eX)
{
// Prompt the user to try again.
ModelState.AddModelError("","The information has been updated by someone else before you saved. Please try again.");
return View(userviewModel);
}
}
return RedirectToAction("Index");
}
以上是大佬教程为你收集整理的当模型属性具有 [ConcurrencyCheck] 属性时,ASP.NET Core MVC ConcurrencyCheck 失败全部内容,希望文章能够帮你解决当模型属性具有 [ConcurrencyCheck] 属性时,ASP.NET Core MVC ConcurrencyCheck 失败所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。