程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了当模型属性具有 [ConcurrencyCheck] 属性时,ASP.NET Core MVC ConcurrencyCheck 失败大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决当模型属性具有 [Concurrencycheck] 属性时,ASP.NET Core MVC Concurrencycheck 失败?

开发过程中遇到当模型属性具有 [Concurrencycheck] 属性时,ASP.NET Core MVC Concurrencycheck 失败的问题如何解决?下面主要结合日常开发的经验,给出你关于当模型属性具有 [Concurrencycheck] 属性时,ASP.NET Core MVC Concurrencycheck 失败的解决方法建议,希望对你解决当模型属性具有 [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; }

当模型属性具有 [ConcurrencyCheck] 属性时,ASP.NET Core MVC ConcurrencyCheck 失败

接下来,在调用 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,请注明来意。