ASP.NET 6 输入验证:创建时的唯一列 - 但更新时出现验证问题

ASP.NET 6 input validation: unique column on create - but validation problem on update

提问人:Sandor.Oros 提问时间:9/21/2023 最后编辑:Denis MichealSandor.Oros 更新时间:9/22/2023 访问量:48

问:

我有一个带有键 ID 的表,并且有一个唯一的列(名称)。创建新行时,名称必须是唯一的。我创建了一个自定义验证器。

public class UniqueNameValidationAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value,
            ValidationContext validationContext)
        {
            var context = (ApplicationDbContext)validationContext.GetService(typeof(ApplicationDbContext));
            if (!context.Recipes.Any(a => a.Name == value.ToString()))
            {
                return ValidationResult.Success;
            }
            return new ValidationResult("Ezzel a névvel már létre van hozva recept!");
        }
    }

添加到模型属性:

[UniqueNameValidation]
public string Name { get; set; } = "";

站点代码(创建和编辑站点代码相同):

<div class="mb-3">
            <label asp-for="Name">Típus neve</label>
            <input asp-for="Name" class="form-control" />
            <span asp-validation-for="Name" class="text-danger"></span>
</div>

创建 POST 时控制器中的代码:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(RecipeTableModel obj)
{
            if (ModelState.IsValid)
            {
                _db.Recipes.Add(obj);
                _db.SaveChanges();
                return RedirectToAction("Index");
            }
            else
            {
                return View(obj);
            }

}

POST 更新时控制器中的代码:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(RecipeTableModel obj)
{
            if (ModelState.IsValid)
            {
                _db.Recipes.Update(obj);
                _db.SaveChanges();
                return RedirectToAction("Index");
            }
            else
            {
                return View(obj);
            }

}

当我尝试使用现有名称创建新行时,它运行良好,我收到错误消息。但是当我尝试更新行时,我收到相同的“已存在”错误消息。

我该如何解决这个问题?

asp.net 实体框架 验证 ASP.NET-CORE-MVC CRUD

评论

0赞 Richard 9/21/2023
我不认为您忽略了更新案例中的当前行:如果更新没有更改,则当前值已经在表中。Name

答:

1赞 Qing Guo 9/21/2023 #1

从你的代码中,我猜这是关于服务器验证的,要在尝试更新行时取消相同的“已经存在”错误消息,您可以检查名称,如果它没有更改,请删除模型状态错误,您可以参考以下代码修改您的 Edit 方法:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(RecipeTableModel obj)
{ 
  var dbobj =   _db.Recipes.AsNoTracking().FirstOrDefault(x => x.Id == 
   obj.Id);
    if (dbobj.Name == obj.Name)
     {
        ModelState.ClearValidationState("Name");
        ModelState.MarkFieldValid("Name");
     }
            if (ModelState.IsValid)
            {
                _db.Recipes.Update(obj);
                _db.SaveChanges();
                return RedirectToAction("Index");
            }
            else
            {
                return View(obj);
            }

}

结果:

enter image description here