提问人:Sandor.Oros 提问时间:9/21/2023 最后编辑:Denis MichealSandor.Oros 更新时间:9/22/2023 访问量:48
ASP.NET 6 输入验证:创建时的唯一列 - 但更新时出现验证问题
ASP.NET 6 input validation: unique column on create - but validation problem on update
问:
我有一个带有键 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);
}
}
当我尝试使用现有名称创建新行时,它运行良好,我收到错误消息。但是当我尝试更新行时,我收到相同的“已存在”错误消息。
我该如何解决这个问题?
答:
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);
}
}
结果:
评论
Name